2016-11-23 69 views
0

只是为了看看它是否会起作用(我知道这是糟糕的形式),我在头文件中完全定义了一个函数,并为主函数中的主函数做了相应的前向声明cpp文件。 C++函数不需要在它们使用的翻译单元中定义,因此头文件几乎完全只是前向声明(内联函数除外)。但是,当我试图编译这个项目时,它说没有未解决的外部问题。头文件没有被编译(C++ Visual Studio 2015)

当我将头文件的全部内容移动到一个源文件(除去头文件),它编译得很好,并按预期执行。那么,构建项目时是不是编译头文件,还是只有一些我不知道的异常?

此外,即使我只是去属性资源管理器中的头文件的属性,并将其File Type设置为C/C++ Code并将其扩展名更改为.cpp,它仍然不会编译(即使它,如果我只是删除它并创建一个新的源文件,我认为这是最奇怪的部分)。

(我与禁用/Za扩展工作,如果改变任何东西)

下面的代码文件

//main.cpp 
void foo(); 

void main() 
{ 
    foo(); 
} 

和头文件

//test.h 
#include <iostream> 

void foo() 
{ 
    std::cout << 'a'; 
} 
+3

除非通过'#include'预处理将头文件拉入翻译单元,否则不会编译头文件。由于您的唯一.cpp文件没有这样的包含,因此它不会被编译,因此没有任何内容可用于(并且显然是您唯一的)翻译单元。 – WhozCraig

+0

http://faculty.cs.niu.edu/~mcmahon/CS241/Notes/compile。HTML –

回答

3

头文件被列入预处理程序进入编译单元 - cpp文件。之后只有cpp文件中的源代码由编译器编译。

当你把你的函数定义到文件头.h中。您不会将此头文件包含到main.cpp中,并且编译器不会将其编译,因为预处理器不会将其包含在main.cpp中。

您可以自己查看预处理器作业的结果。在Visual Studio中,使用Preprocessor属性页上的/P选项。对于main.cpp输出将在main.i

1

头文件并不是自己编译的,只要想象文本实际上在包含它的.cpp文件中。这个新的“合并”文件就是编译好的文件。所以你可以把函数放在一个头文件中,当它被包含在一个.cpp文件中时它会被编译。

不好的原因是,如果您将其包含在第二个.cpp文件中,它将尝试再次编译,您将遇到问题。

1

标题中函数定义的问题并不是它们被跳过。真正的风险是,他们编译两次,而这一次太多了。 C++有一个叫做One Definition Rule的东西,并且通过编译一个函数两次就违反了这个规则。

有一个重要的例外:inline函数是免除的,并且可以在每个翻译单元中定义。

相关问题