加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C标题和CPP包括

发布时间:2020-12-16 09:39:51 所属栏目:百科 来源:网络整理
导读:快速的问题. 我试图让C被钉下来,今天我花了几个小时的双定义链接器错误(“这已经定义了
快速的问题.

我试图让C被钉下来,今天我花了几个小时的双定义链接器错误(“这已经定义了!”)我终于意识到这是因为我有这样的布局:

> main.cpp

#include Dog.cpp

> Dog.cpp

#include Dog.h

> Dog.h

// (Dog class and prototype of test function)

现在我通过在main.cpp中包含Dog.h而不是Dog.cpp来清除它.

通过包含.h文件,具有相同前缀的.cpp文件是否可以用程序编译?

当程序只包含.h并且没有任何对Dog.cpp的引用时,我感到震惊.我花了很多年的谷歌搜索,但没有答案真的帮助我理解发生了什么.

编辑:我忘了添加我在.h中的原型,并在.cpp中为类定义了函数,这就是给出了“已定义”错误的原因.

解决方法

By including the .h file,does the .cpp file with the identical prefix get compiled with the program? I was astounded when the program ran with only the .h included and no references whatsoever to Dog.cpp.

没有.

您的程序是分阶段构建的.

>对于编译阶段,每个翻译单元只需要声明(大致相当于单个.cpp文件,其中#includes已解决).声明甚至首先存在的原因是作为一种“承诺”,以后可以找到完整的函数定义.

g++ -c Dog.cpp               # produces `Dog.o`
g++ -c main.cpp              # produces `main.o`

>对于链接阶段,在翻译单元之间解析符号.您必须将编译Dog.cpp和编译main.cpp的结果链接在一起(也许您的IDE正在为您执行此操作?),此链接进程会在它们之间找到所有正确的函数定义以生成最终的可执行文件.

g++ Dog.o main.o -o program  # produces executable `program`

(或者你实际上还没有进入链接阶段,只有一个目标文件(Dog.o);你不能执行它,部分原因是因为它没有所有的函数定义.)

这两个阶段可以同时完成,“速记”:

g++ Dog.cpp main.cpp -o program  # compiles,links and produces executable

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读