5

今天我在那里接受了一次采访,他们问我可以包含.c file到源文件中吗?我说yes。因为几年前我在他们包含的一些项目中看到了同样的情况.c file。但刚才我也在尝试同样的方法。

ABC

#include<stdio.h>
void abc()
{ printf("From ABC() \n"); }


主程序

#include<stdio.h>
#include "abc.c"
int main()
{   void abc();
    return 0;
}

收到错误:

D:\Embedded\...\abc.c :- multiple definition of 'abc'

它哪里出错了?

我写了一个 abc.h 文件(abc.h 的主体是{ extern void abc(void); }),并将该文件包含在abc.c(注释掉#include abc.c)中。工作得很好。

4

4 回答 4

17

执行以下操作:

abc.c

#include <stdio.h>
void abc()
{printf("From ABC() \n");}

main.c

#include<stdio.h>
#include "abc.c"
int main()
{   
    abc();
    return 0;
}

(不需要头文件)

然后,要编译,您只需编译main.c. 不要试图同时编译 abc.cand main.c,因为那样你就会abc()定义函数两次。

您需要了解这#include基本上是“复制粘贴”,仅此而已。如果你告诉它#include "abc.c",它只会获取 的内容abc.c,并将它们“粘贴”到你的main.c文件中。因此,使用上面的 for main.c,在预处理器处理它之后,你main.c会看起来像这样(我忽略了#include <stdio.h>s):

#include<stdio.h>
#include <stdio.h>
void abc()
{printf("From ABC() \n");}
int main()
{   
    abc();
    return 0;
}

这是一个有效的程序。

也就是说,您通常不应该这样做;您应该.c单独编译所有文件,然后才将它们链接在一起。

于 2012-07-04T19:14:50.530 回答
6

包含 C 文件是完全有效的,只要您不尝试自己编译包含的 C 文件,然后将其与包含其他文件的 C 文件中的目标文件链接在一起。

如果这样做,您将在两个文件中定义相同的符号(通常是一个函数),这将导致您发布的错误。

如果您有多个源文件,您通常不包含它们,而是分别编译它们。然后链接器将目标文件合并到一个可执行文件(或库)中。

于 2012-07-04T19:17:41.403 回答
4

您可以包含任何扩展名的文件。

void abc();在你的程序中,你已经在 main() 中重新定义了。而是把声明abc ();

于 2012-07-04T19:23:00.443 回答
2

您可以包含任何您喜欢的内容,预处理器不关心文件扩展名。将头文件命名为“.h”,将源文件命名为“.c”或“.cpp”只是一些传统。

You only have to be sure, that after compiling the whole project you don't run into linker problems (e.g. giving both "abc.c" and "main.c" to the compiler would result in multiple definitions of your function).

于 2012-07-05T06:34:26.627 回答