我们不能包含 .c 文件吗?
Can't we include .c file?
今天我在那里接受了一次采访,他们问我可以.c file
包含在源文件中吗?我说yes
.因为几年前我在他们包含.c file
的一些项目中看到了同样的情况。但刚才我也在尝试。
美国广播公司
#include<stdio.h>
void abc()
{ printf("From ABC() n"); }
主.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的正文是{ extern void abc(void); }
),并将文件包含在abc.c
中(注释掉#include abc.c
)。工作正常。
按如下方式操作:
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
文件中。因此,使用上述 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
文件,然后才将它们链接在一起。
是完全有效的,只要您不尝试自行编译包含的 C 文件,然后将其与包含另一个文件的 C 文件中的目标文件链接在一起。
如果这样做,您将在两个文件中定义相同的符号(通常是函数),这将导致您发布的错误。
如果您有多个源文件,则通常不包含它们,而是单独编译它们。然后,链接器将目标文件合并到单个可执行文件(或库中)。
您可以包含任何扩展名的文件。
在您的程序中,您在 main () 中重新定义了void abc();
,而只是将语句abc ();
您可以包含任何您喜欢的内容,预处理器不关心文件扩展名。将标头命名为".h",将源文件命名为".c"或".cpp"只是一些传统。
你只需要确定,在编译整个项目后,你不会遇到链接器问题(例如,同时向编译器提供"abc.c"和"main.c"会导致函数的多个定义)。
- 为什么头文件不能相互包含?
- 为什么我可以从C++文件中读取 int 值,但不能浮点?
- 为什么我不能从同一目录中的另一个文件中 #include 我的类?
- CStdioFile 不能处理大于 2GB 的文件?
- 不能在其他文件中包含结构
- 有没有办法关闭文件? fclose 不能很好地工作
- 我的项目中某些仅标头文件不能包含使用 CMake 和 Vscode 的"SFML/Graphics.hpp"
- OpenGL不能在核心配置文件中使用glVertexAttrib进行绘制
- 为什么这个文件不能在 gcc 中编译?它在 VS 中工作正常
- Ffmpeg头文件不能在windows中编译
- 为什么文件不能在Apache的CGI中创建
- 用Visual Studio 11编译的可执行文件有什么特别之处,导致这些可执行文件不能在Windows XP上执行?
- 文件不能正确读取c++ ifstream
- 使文件不能链接c++,即使有.o文件
- c++文件不能使用特定的#include进行编译,而其他文件都可以
- 为什么对象 (.obj) 文件不能跨平台移动?
- c++可执行文件不能在windows7-64位不兼容的环境下运行
- 为什么我的#include文件不能编译
- 包含文件不能被识别,即使它们在正确的目录中
- 为什么这个生成文件不能正确编译?