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);
}
}
...全文
709 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
  • 打赏
  • 举报
回复
这个。。。你是要研究编译器吗? 看你的代码好像是个新手啊,嘿嘿 好好理解一下声明、编译、链接吧
下载代码方式:https://pan.quark.cn/s/28492da20c79 依据所提供的文件资料,本资源将系统地探讨FPGA(即现场可编程门阵列)的核心概念、其在视频图像技术领域的入门及进阶知识要点,以及图像处理算法的实现方法。此外,还将对VIPBoardBig这一特定FPGA开发板的详细资料和使用途径进行深入剖析。 FPGA的入门与进阶学习主要涉及以下核心内容: 1. FPGA的基础概念:FPGA是一种能够通过编程进行配置的集成电路,主要目的是达成硬件逻辑的可重构特性。该类芯片由大量的可配置逻辑模块(CLB)、输入输出模块(IOB)以及可编程互连资源共同构成。 2. FPGA开发板与相关套件:FPGA开发板是一种用于FPGA芯片学习和测试的硬件平台,通常配备有基础的外设设备,例如LED指示灯、按键开关、LCD显示屏、串口通信接口等。套件则通常包含硬件板卡、技术文档、相关资源,以及可能的软件工具和示例代码集。VIPBoardBig即为本教程选用的FPGA开发板,拥有特定的硬件配置和功能特性。 3. FPGA的开发流程:FPGA开发一般涉及硬件描述语言(HDL)的设计与仿真阶段,常用语言为Verilog或VHDL。随后,借助综合工具将设计蓝图转化为FPGA内部的逻辑网络,最终通过编程设备将配置文件传输至FPGA芯片中,从而实现设计的预期功能。 4. 外设开发与设计工作:涵盖LED显示控制、键盘驱动、LCD显示驱动、UART串口设计等基础外设的开发任务。这部分知识将引导学习者掌握如何在FPGA平台上管理和运用这些基础外设。 5. VGA驱动显示与字符显示测试:VGA(Video Graphics Array)是一种视频传输接口标准,能够支持640x480...
内容概要:本文系统阐述了企业在搭建官方知识库后如何通过“7步锚定法”实现GEO(生成式引擎优化)的落地,重点在于从知识库走向内容矩阵的战略升级。文章指出知识库仅为起点,真正的核心是让大模型“信任并推荐”企业内容。为此提出“一个主战场+多个品牌布局”的策略,强调需根据行业特性选择高商业流量的大模型(如豆包、文心一言、通义千问等),而非工具性模型(如ChatGPT、Claude)。通过业务场景画像、大模型流量测绘、采信逻辑拆解、内容架构设计、语义关键词埋点、信源建设与效果迭代七步法,构建高质量、高可信度的内容体系,并警惕“全模型覆盖、内容堆砌、一套内容通用、忽视第三方平台”四大误区。最终指出GEO本质是一场认知战,比拼的是对大模型逻辑与客户需求的理解深度及长期主义投入。; 适合人群:已完成官方知识库搭建、希望提升AI引用率与获客效率的企业市场负责人、品牌运营、数字营销从业者及SEO/GEO优化相关人员。; 使用场景及目标:①指导企业科学选择主攻大模型并制定差异化内容策略;②构建符合大模型采信逻辑的高质量内容矩阵;③避免常见GEO落地误区,提升AI搜索下的品牌曝光与转化效果;④建立可持续优化的数据反馈闭环。; 阅读建议:建议结合自身行业特征与客户决策路径,逐步实践“7步法”,优先聚焦单一主战场打透,注重内容质量与第三方权威信源建设,坚持3-6个月持续投入以观察真实效果。

70,039

社区成员

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

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