我无法抓住这个想法,阅读文档并没有帮助我。
我的问题是:
我在Visual Studio 2010中尝试了这一切。至少没有语法错误。但我想解释一下。所以,我希望你会善良并帮助我。
答案 0 :(得分:6)
标准和编译器并不关心文件是.cpp
还是.h
还是.monkeyface
。将源代码构建到实现和头文件背后的概念实际上只是可以帮助管理源代码的方法。尽管如此,没有以可接受的方式构建源代码通常被认为是错误的或不好的C ++。
所有#include
都告诉预处理器包含您在当前文件中指定的文件的内容。这就像将其他文件复制并粘贴到您的文件中一样。当您说#include "foo.h"
时,它只包含foo.h
的内容而根本不关心foo.cpp
- 它甚至不知道它存在(并且没有理由它存在存在)。
在实现和头文件中构建源代码非常有用 - 它避免了依赖关系和多个定义的问题,并且还在一定程度上改善了编译时间。当您的代码使用另一个类时,您只需要#include
该类的头文件。原因是因为您的代码不需要关心类的实现,它只需要知道它的外观(它的名称,成员,基类等)。它并不关心成员函数的实现方式。
扩展程序.cpp
和.h
仅仅是约定。有些人更喜欢使用.hpp
作为头文件。有些人甚至使用.tpp
进行模板实现。您可以随意命名 - 是的,您甚至可以包含.txt
文件。您的编译器可能会尝试从文件扩展名推断文件的内容(例如,将其编译为哪种语言),但这通常是可重写的。
因此,如果您的main.cpp
包含foo.h
,因为它使用的是foo
类,那么foo.cpp
会涉及到什么时候?那么,在main.cpp
的编译中,它根本没有涉及。正如我们上面讨论的那样,main.cpp
不需要知道类的实现。但是,在编译整个程序时,您会将每个.cpp
文件传递给编译器,以便单独编译。也就是说,你会做g++ main.cpp foo.cpp
之类的事情。编译foo.cpp
时,它将包含 it 需要编译的标题。
在编译了每个.cpp
文件后(包括它们所依赖的标题),然后将它们链接在一起。在foo::bar()
中使用成员函数main.cpp
将在foo::bar()
中与foo.cpp
中的{{1}}的实施相关联。
答案 1 :(得分:1)
#include
指令告诉预处理器读取文件。就是这样。
答案 2 :(得分:1)
预处理器只是在遇到#include指令时插入给定文件的全部内容。
答案 3 :(得分:0)
不,预编译器对.cpp文件一无所知
是,如果文件没有扩展名
您可以包含所需的任何文件。它并不代表你会从中得到任何有用的东西。
见上文第3点。
答案 4 :(得分:0)
#include
是一个简单的“在此处插入给定文件的内容”机制,因此预处理器将包含您指定的文件。如果包含.h文件,预处理器和编译器都不会知道相应的.cpp文件 - 每个.cpp文件都是单独编译的(.h文件的目的是通知编译器哪些函数存在于当前.cpp文件)。编译之后,将调用链接器,然后才会将不同.cpp文件的编译结果组合在一起。