【问题标题】:What is the conventions for headers and cpp files in C++?C++ 中头文件和 cpp 文件的约定是什么?
【发布时间】:2009-02-12 05:19:05
【问题描述】:

在 C++ 中,在“主”文件中包含类文件头的约定是什么。例如

myclass.h 

class MyClass {
  doSomething();
}


myclass.cpp

  doSomething() {
      cout << "doing something";
  }


run.cpp

#include "myclass.h"
#include "myclass.cpp"

etc..

这是比较标准的吗?

【问题讨论】:

    标签: c++ header include


    【解决方案1】:

    您不包含 .cpp 文件,仅包含 .h 文件。 .cpp 中的函数定义将被编译为 .obj 文件,然后链接到最终的二进制文件中。如果将 .cpp 文件包含在其他 .cpp 文件中,则会编译出两个具有相同功能定义的不同 .obj 文件,这将导致链接器错误。

    【讨论】:

      【解决方案2】:

      请参阅Understanding C Compilers 以获取有关此问题的许多好的答案。

      【讨论】:

      【解决方案3】:

      您可以说一个 .cpp 文件及其所有包含的标头构成一个翻译单元。顾名思义,一个翻译单元是独立编译的。每个翻译单元的结果通常称为 file.o 或 file.obj,然后由链接器链接在一起,修复尚未解析的引用。所以在你的情况下,你有

      Translation Unit 1 = run.cpp: myclass.h ...
      Translation Unit 2 = myclass.cpp: myclass.h ...
      

      您的类定义将出现在两个翻译单元中。但这没关系。这是允许的,只要两个类的定义相同。但如果函数不是内联的,则不允许在两个翻译单元中出现相同的函数。非内联函数只允许在一个翻译单元中定义一次。然后,让链接器获取每个翻译单元的结果,并将它们绑定到一个可执行文件:

      Executable = mystuff: run.o myclass.o ...
      

      【讨论】:

      • 我可能是错的,但我认为该类在两个单元中声明,并且仅在一个单元中定义.h 文件包含类的*声明.cpp包含*定义
      • 不,它包含定义。 cpp 文件包含的是成员函数/静态成员的定义。但是类定义放在标题中(类声明只是“class foo;”而definition可能是“class foo {};”)
      【解决方案4】:

      通常您单独编译 .cpp 文件并将生成的 .o 与其他 .o 链接

      因此 myclass.cpp 将包含 myclass.h 并将被编译为一个单元。

      【讨论】:

        【解决方案5】:

        您单独编译 cpp 文件。如果您将任何给定的 cpp 文件包含在两个或多个 cpp 文件中,您可能会在链接阶段遇到冲突。

        【讨论】:

          【解决方案6】:

          您不能在另一个 *.cpp 中包含一个 *.cpp。而是:


          myclass.h

          class MyClass {
            doSomething();
          }
          

          myclass.cpp

          #include "myclass.h"
          
          MyClass::doSomething() {
                cout << "doing something";
          }
          

          run.cpp

          #include "myclass.h"
          
          etc..
          

          不要将 myclass.cpp 包含在 main.cpp 中(这样编译器会一次看到它们),而是分别编译 myclass.cpp 和 main.cpp,然后让“链接器”将它们组合成一个可执行文件。

          【讨论】:

            猜你喜欢
            • 2011-03-11
            • 1970-01-01
            • 1970-01-01
            • 2010-09-24
            • 1970-01-01
            • 2012-02-12
            • 1970-01-01
            • 2012-04-23
            相关资源
            最近更新 更多