【问题标题】:C++ include .h includes .cpp with same name as well?C++ 包含 .h 是否也包含同名的 .cpp?
【发布时间】:2011-02-04 03:19:29
【问题描述】:

我有包含 header.h 的 text.cpp 和包含 header.h 的 header.cpp。

header.cpp 也会被编译吗?我在这里按照指南进行操作,我感到非常困惑。

另外,我要问的正确术语是什么?我知道我听起来像个白痴,我很抱歉,但我很无知。

哦,int main() 在 test.cpp 中。

另外,如果 header.cpp 包含 <iostream>,为什么我不能在 text.cpp 中使用 iostream 函数调用?如果我在 text.cpp 中包含<iostream>,它会在程序中包含两次(换句话说,膨胀它)?

【问题讨论】:

  • 你听起来不像个白痴。白痴不会寻求帮助。

标签: c++ compiler-construction include compilation


【解决方案1】:

您告诉编译器要编译哪些 C++ 文件。 #include 与此无关。

例如,如果您使用的是 g++:

g++ text.cpp // Doesn't compile header.cpp
g++ text.cpp header.cpp // Compiles both

(or, alternatively you can compile one file at a time and then link them)
g++ text.cpp -o text.o
g++ header.cpp -o header.o
g++ text.o header.o -o your-program

如果您使用 Visual Studio 并创建了一个项目,那么您创建的所有 C++ 文件都将被自动编译。

如果你都没有使用,请告诉我你的编译器的名称,我可以告诉你确切的语法:)


现在,关于您的另一个问题:

另外,如果 header.cpp 包含 iostream,为什么我不能使用 iostream 如果是,则在 text.cpp 中调用函数 包括?如果我将 iostream 包含在 text.cpp 将它包含在 编程两次(换句话说,膨胀 它)?

#include 告诉编译器简单地“复制您包含的文件的所有内容,并将它们粘贴到#include 行所在的位置”。所以,理论上,你可以简单地用记事本打开iostream,在你的.cpp文件中选择全部,ctrl-c和ctrl-v,最终效果会完全一样=)

所以是的,您希望在其中使用它的每个 .cpp 文件都需要包含它,并且它不会“膨胀”您的程序:它只包含类定义、外部函数等。

哦,这是不言而喻的,但是 C++ 是一种非常广泛和困难的编程语言,通过书本学习它比通过指南学习要好得多。如果您不想花钱,一本可以免费(可下载)的 C++ 书籍是Thinking in C++, Bruce Eckel。否则,如果您想购买,可以找到一个很好的清单here

【讨论】:

【解决方案2】:

header.cpp 只有在编译时才会被编译。当您编译 test.cpp 时,它不会自动被吸收。要生成运行程序,您还必须将生成的 .o 文件链接到单个二进制文件中,如下所示(过于简化):

c++ -c test.cpp
c++ -c header.cpp
c++ -o test test.o header.o

【讨论】:

    【解决方案3】:

    您单独或一起编译每个源文件,然后链接生成的对象模块。

    例如Visual C++(一起)

    cl text.cpp header.cpp /Fefoo
    

    或单独,

    cl /c text.cpp
    cl /c header.cpp
    link text.obj header.obj /out:foo.exe
    

    要获得生成的 EXE 图像,foo.exe

    另外,如果 header.cpp 包含 , 为什么我不能使用 iostream 如果是,则在 text.cpp 中调用函数 包括?如果我将 iostream 包含在 text.cpp 将它包含在 编程两次(换句话说,膨胀 它)?

    由于标头只包含声明,因此多次包含它们并没有什么坏处。它们不会膨胀任何东西,因为编译器在进行类型检查后会丢弃它们。

    虽然如果你有类型定义,你需要#include 保护,这样类型就不会被重新定义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-27
      • 2012-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多