将c文件包含在另一个文件中

And*_*rew 5 c

我想在另一个文件中包含.c文件.有可能吗?如果我在.c文件中包含头文件,它可以正常工作,但如果我在另一个.c文件中包含.c文件,它也不能正常工作.
我正在使用Visual Studio,我收到以下错误:

main.obj : error LNK2005: _sayHello already defined in sayHello.obj  
/* main.c  */
#include "sayHello.c"

int main()
{
    return 0;
}  
/* sayHello.c */

#include <stdio.h>

void sayHello()
{
    printf("Hello World");
}
Run Code Online (Sandbox Code Playgroud)

我不知道这个错误可能意味着什么.是时候问更高级的C编码员了.:)

Joh*_*ode 20

我想在另一个文件中包含.c文件.

不,你没有.你真的,真的没有.不要采取任何走上这条道路的步骤; 它只会以痛苦和痛苦结束.这对于像你的例子这样的琐碎程序来说是不好的做法,对于任何真正复杂的程序来说都是如此.一个文件中的一个简单的单行更改将要求您重建该文件和包含它的任何内容,这是浪费时间.您失去了控制数据和功能访问的能力; 包含的.c文件中的所有内容对包含文件都是可见的,甚至声明了函数和文件范围变量static.如果最终包含一个.c文件,其中包含另一个.c文件,其中包含另一个.c文件,那么weiter,您最终可能会使用一个太大而无法让编译器处理的转换单元.

单独的编译和链接是一个明确的好事.您应该包含在.c文件中的唯一文件是描述接口的头文件(类型定义,函数原型声明,宏定义,外部声明),而不是实现.

  • 这是一个非常固执己见的意见。我同意强烈建议图书馆不要将其作为一种做法。对于复杂的程序来说,这将是低效的、混乱的,并且很可能会产生编译错误。但在没有上下文的情况下说“不,你没有。你真的、真的没有。”是相当傲慢和自以为是的。我已经做过很多次快速而肮脏的测试、基准测试和调试……这是一种将目标代码放入简单测试平台的简单方法,而无需编译、链接或生成文件的麻烦。 (4认同)
  • @zgulser:是的,当您更改*interface*(宏定义,函数delcaratoin,类型定义等)时,您必须重建依赖于该接口的所有内容.但是,如果只更改函数的*implementation*,则不需要重建除包含该函数的文件以外的文件.不幸的是,通过在其他.c文件中包含.c文件,当你更改深埋在`for`循环中的一行时,你最终会重建世界. (2认同)

unw*_*ind 9

它有效,但您需要小心如何构建程序.此外,正如人们在评论中指出的那样,这通常被认为是一个坏主意.这是意料之外的,它会产生这样的问题.很少有benetfits,特别是对于看似简单的程序.你应该重新考虑这种方法.

做完这样的事情之后,你应该只编译main.c,而不是试图将它与sayHello.c你似乎正在做的编译结果联系起来.

您可能需要告诉Visual Studio 从构建中排除后一个文件.

  • @Andrew 我链接到了一个有关此问题的问题。:) (2认同)

小智 5

是的,任何“.c”文件都可以包含到另一个程序中。因为在程序中包含“.h”文件,例如“stdio.h”。之后我们就可以调用写入这个外部文件的函数了。

测试.c::

#include<stdio.h>
#include<conio.h>
void xprint()
{
    printf("Hello World!");
}
Run Code Online (Sandbox Code Playgroud)

main.c::

#include "test.c"
void main()
{
   xprint();
   getch();
}
Run Code Online (Sandbox Code Playgroud)

输出::世界你好!


Qua*_*eek 0

您可能定义了该函数两次

void sayHello()
{
printf("Hello World");
}
Run Code Online (Sandbox Code Playgroud)

一份在当前文件中,一份在 sayhello.c 中

您必须删除一个定义。

  • @Andrew:相信链接器,它知道。 (5认同)