C ++包括.h包括同名的.cpp?

时间:2010-04-04 04:25:56

标签: c++ compiler-construction include compilation

我有text.cpp,其中包括header.h和header.cpp,其中包括header.h。

还会编译header.cpp吗?我在这里跟踪指南,我很困惑。

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

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

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

3 个答案:

答案 0 :(得分:4)

您告诉编译器要编译哪些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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

E.g。 Visual C ++(Together)

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 guards,以便不重新定义类型。