我们不能包含.c文件吗?

Ras*_*yak 5 c c++ include

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

abc.c

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


main.c中

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

得到错误:

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

哪里出错了?

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

hou*_*oft 15

做到如下:

abc.c:

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

main.c:

#include<stdio.h>
#include "abc.c"
int main()
{   
    abc();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

(不需要头文件)

然后,要编译,你只需要编译main.c.不要试图编译既 abc.cmain.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;
}
Run Code Online (Sandbox Code Playgroud)

这是一个有效的计划.

那说你一般不应该这样做; 你应该.c单独编译所有文件,然后将它们链接在一起.

  • 原型不是问题.这不会导致*多重定义*错误. (2认同)
  • @RasmiRanjanNayak:嗯?然后你的反病毒有问题:) (2认同)

Thi*_*ter 6

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

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

如果您有多个源文件,通常不包含它们,而是单独编译它们.然后,链接器将目标文件合并为单个可执行文件(或库).