C++标题和CPP包括

Tho*_*esu 3 c++ program-entry-point header

快速的问题.

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

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

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

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

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

Lig*_*ica 7

通过包含.h文件,具有相同前缀的.cpp文件是否可以用程序编译?当程序只包含.h并且没有任何对Dog.cpp的引用时,我感到震惊.

没有.

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

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

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

    g++ Dog.o main.o -o program  # produces executable `program`
    
    Run Code Online (Sandbox Code Playgroud)

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

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

g++ Dog.cpp main.cpp -o program  # compiles, links and produces executable
Run Code Online (Sandbox Code Playgroud)