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

时间:2012-07-04 19:14:01

标签: c++ c include

今天我在那里接受采访他们问我可以将.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)。工作得很好。

4 个答案:

答案 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.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;
}

这是一个有效的程序。

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

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:4)

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

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

答案 3 :(得分:2)

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

您只需要确定,在编译整个项目之后,您不会遇到链接器问题(例如,将“abc.c”和“main.c”同时提供给编译器会导致函数的多个定义)。