今天我在那里接受采访他们问我可以将.c file
包含在源文件中吗?
我说yes
。因为几年前我在一些包含.c file
的项目中看到了同样的情况。但是刚才我也在尝试。
abc.c
#include<stdio.h>
void abc()
{ printf("From ABC() \n"); }
的main.c
#include<stdio.h>
#include "abc.c"
int main()
{ void abc();
return 0;
}
收到错误:
D:\Embedded\...\abc.c :- multiple definition of 'abc'
哪里出错?
我写了一个abc.h文件(abc.h的主体是D:\Embedded\...\abc.c :- multiple definition of 'abc'
),
并将文件包含在{ extern void abc(void); }
中(注释掉abc.c
)。工作得很好。
答案 0 :(得分:14)
按如下方式进行:
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.c
和main.c
,因为这样您就可以定义两次abc()
函数。
您需要了解#include
基本上是“复制粘贴”,仅此而已。如果您告诉#include "abc.c"
,它只会获取abc.c
的内容,并在您的main.c
文件中“粘贴”它们。因此,使用上面的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
文件,然后将它们链接在一起。
答案 1 :(得分:5)
包含C文件是完全有效的,只要您不尝试自己编译包含的C文件,然后将其与包含其他文件的C文件中的目标文件链接在一起。
如果你这样做,你将在两个文件中定义相同的符号(通常是一个函数),这将导致你发布的错误。
如果您有多个源文件,通常不包含它们,而是单独编译它们。然后,链接器将目标文件合并为单个可执行文件(或库)。
答案 2 :(得分:4)
您可以包含任何扩展名的文件。
在你的程序中,你在main()中重新定义了void abc();
。而只是把声明abc ();
答案 3 :(得分:2)
您可以包含您喜欢的任何内容,预处理器不关心文件扩展名。将标题“.h”和源文件命名为“.c”或“.cpp”只是一些传统。
您只需要确定,在编译整个项目之后,您不会遇到链接器问题(例如,将“abc.c”和“main.c”同时提供给编译器会导致函数的多个定义)。