C多文件编译和include的用法

s1070 2015-02-07 05:57:25
问题 1:在include 语句是否可以包含源文件?
在文件1.cpp开头 #include "3.cpp",并没有报错,我理解为将文件3.cpp中的代码直接拷贝到1.cpp中,
而1.cpp中已经包含stdio,按说不应该报错printf不能识别啊?

问题2: 像这种情况应该如何正确书写?
问题3:文件3.cpp中,在包含一句 #include <stdio.h>的写法是否可行和科学?
问题4:麻烦解释错误出现的原因



错误现象描述:

(1) 文件编译正常,没有错误


(2)在执行链接的时候,3.cpp中的 printf语句不能被识别,报错






文件1.cpp中的代码如下

#include <stdio.h> 
#include "3.cpp"


void fun3();

int main(void)
{
fun3();


return 0;
}



文件3.cpp中的代码如下

void fun3()
{
int a[4];
int *pa;
int index;

double b[4];
double *pb;

pa=a;
pb=b;

printf("%23s %10s\n","int","double");

for (index=0;index<4;index++)
{
printf("pointer + %d: %10p %10p\n",index,pa+index,pb+index);
}
}
...全文
648 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaocai0001 2015-03-20
  • 打赏
  • 举报
回复
用gcc做预编译 (-E)选项, 然后你就理解#include到底是干什么用的。
mymtom 2015-03-20
  • 打赏
  • 举报
回复
不要include .c 文件,除非有充足的理由这么做
一根烂笔头 2015-03-18
  • 打赏
  • 举报
回复
重复定义了fun3. 把头文件包含进来时,头文件的内容和当前文件就形成一个编译单位,同一个编译单位内不能出现同ID的重复定义,多次声明可以
wbswck 2015-03-18
  • 打赏
  • 举报
回复
没试过这样用
一根烂笔头 2015-03-18
  • 打赏
  • 举报
回复
Q2:1.每个编译单元各自独立编译,链接成一个可执行模块即可;2.条件编译 Q3:标准头文件都有条件编译,不会出现重包含
vkkeva 2015-03-16
  • 打赏
  • 举报
回复
原来“每个源文件是一个编译单元,各自编译,然后才链接起来成为可执行文件”,难怪我include文件会报错,不include反而正常,还没接触到编译原理,学include时想到的,学习了
赵4老师 2015-02-09
  • 打赏
  • 举报
回复
VC编译选项加/EP /P,重新编译,查看对应的.i文件。gcc加-E
sszhouplus 2015-02-09
  • 打赏
  • 举报
回复
在c语言里面include源代码是一种编程技巧也很常用,很多工程师这么干。 但需要注意几点: 1. 既然已经include xx.c/xxx.cpp了就不要再在工程里添加这个文件了。不然会被编译2次,而且容易有问题。 你的工程中可以把3.cpp拿掉,因为1.cpp已经include 3.cpp所以不需要再在工程添加编译3.cpp了。 2. 被include的文件里面函数或全局变量如果不需要其他文件使用的话最好是static类型。这样一个源文件被多个.c include也不会报冲突。
东莞某某某 2015-02-09
  • 打赏
  • 举报
回复
可以Include #include后,编译器会将include的文件内容拷贝到当前文件中,这样的话,将会导致重复定义的错误。应当避免这样的用法。 而且,编译器将.cpp .c .cc等各种源文件视为编译单位
黎大 2015-02-09
  • 打赏
  • 举报
回复
重复定义,楼主好浪
707wk 2015-02-07
  • 打赏
  • 举报
回复
没试过这样用
bear234 2015-02-07
  • 打赏
  • 举报
回复
include可以include任意文件 和文件后缀无关 你甚至可以在你的Source Files里添加个名字叫a.bdfadfdsafd的文件 然后别的文件一样可以include它 只不过,人们一般把c++的源代码的文件后缀约定为.h和.cpp而已 你喜欢你可以写成.head .c 或者其他 这样约定是有道理的,任何变量,不论数据还是函数,都可以声明无数次但是定义只能定义一次 因此,人们把声明写在.h文件里 定义写在.cpp里 这样需要哪个变量或者函数的时候,只需要include声明这个变量或者函数的.h文件即可 即使这个文件被include了很多次 也没关系 因为声明可以声明无数次 但是定义,只能定义一次 如果出现重复定义,程序会在链接是报错(LNK型错误) 所以,你当然可以include一个里面有某些数据或函数的定义的cpp 或许你这样做程序也可以正常运行 但这也只是因为你恰好只include了一次这个cpp,如果你在另一个文件里也include这个cpp 就会报错 记住,定义只能出现一次,而声明可以出现无数次----只要不要出现文件的互相include 一般在头文件里,我们会放变量和函数的声明,另外还可以放const修饰的数据,还可以放inline函数 const修饰的数据默认类型是static的,如果你强行用extern修饰一个const 一样不应该放在可能被include多次的在头文件里 而inline函数可以放在头文件里,是因为inline被编译器处理成一种copy机制,类似#define,任何使用某个inline函数的文件都应该在使用前写一次这个inline函数 因此放到头文件里,哪儿用到了就在哪儿include 比较方便
你怎么了熊吉 2015-02-07
  • 打赏
  • 举报
回复
注意报错的是3.cpp这个文件,而不是被拷贝到1.cpp里的那份3.cpp代码
zaixiankaifa 2015-02-07
  • 打赏
  • 举报
回复
值得研究下去,要弄懂了才是学到东西
你怎么了熊吉 2015-02-07
  • 打赏
  • 举报
回复
分清编译和链接 每个源文件是一个编译单元,各自编译,然后才链接起来成为可执行文件 你这个写法,虽然include会展开,使得1.cpp能编译通过,但3.cpp编译通不过 另外如果不是为了研究,不要include源文件
就想叫yoko 2015-02-07
  • 打赏
  • 举报
回复
include 在预编译阶段会做展开,把内容include进来 但是一般IDE会把cpp文件认为是编译单元
cutmelon 2015-02-07
  • 打赏
  • 举报
回复
这个。。。你是要研究编译器吗? 看你的代码好像是个新手啊,嘿嘿 好好理解一下声明、编译、链接吧

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧