我有text.cpp,其中包括header.h和header.cpp,其中包括header.h。
还会编译header.cpp吗?我在这里跟踪指南,我很困惑。
另外,我要问的是什么是正确的术语?我知道我听起来像个白痴,我道歉,但我无知。
哦,int main()
在test.cpp中。
另外,如果header.cpp包含<iostream>
,为什么我不能在text.cpp中使用iostream函数调用(如果包含它)?如果我在text.cpp中包含<iostream>
它将被包含在程序中两次(换句话说,膨胀它)?
答案 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,以便不重新定义类型。