C++ 未编译头文件(C+;+;Visual Studio 2015)
为了看看它是否能工作(我知道它的形式很糟糕),我在头文件中完全定义了一个函数,并在主cpp文件中为该函数做了相应的转发声明。C++函数不需要在它们使用的翻译单元中定义,因此为什么头文件几乎完全是向前声明(除了内联函数之外)。然而,当我试图编译这个项目时,它说有未解决的外部问题 当我将头文件的全部内容移动到源文件中(同时删除头文件)时,它编译得很好,并按预期执行。那么,在构建项目时头文件是不是没有编译,或者只是有一些我不知道的异常 此外,即使我只是在property explorer中转到头文件的属性,将其C++ 未编译头文件(C+;+;Visual Studio 2015),c++,visual-studio-2015,C++,Visual Studio 2015,为了看看它是否能工作(我知道它的形式很糟糕),我在头文件中完全定义了一个函数,并在主cpp文件中为该函数做了相应的转发声明。C++函数不需要在它们使用的翻译单元中定义,因此为什么头文件几乎完全是向前声明(除了内联函数之外)。然而,当我试图编译这个项目时,它说有未解决的外部问题 当我将头文件的全部内容移动到源文件中(同时删除头文件)时,它编译得很好,并按预期执行。那么,在构建项目时头文件是不是没有编译,或者只是有一些我不知道的异常 此外,即使我只是在property explorer中转到头文件的
文件类型设置为C/C++code
,并将其扩展名更改为.cpp,它仍然不会编译(即使我只是将其删除并创建一个新的源文件,我认为这是最奇怪的部分)
(我正在使用禁用的扩展/Za
,如果这有什么变化的话)
这是代码文件
//main.cpp
void foo();
void main()
{
foo();
}
和头文件
//test.h
#include <iostream>
void foo()
{
std::cout << 'a';
}
//test.h
#包括
void foo()
{
std::cout头文件由预处理器包含到编译单元-cpp
文件中。之后编译器只编译cpp
文件中的源代码
当您将函数定义放入头文件.h
中时。您不会将此头文件包含在main.cpp
中,编译器也不会编译它,因为预处理器不会将其包含在main.cpp
中
您可以自己查看预处理器作业的结果。在Visual Studio中,使用属性页上的/p
选项。对于main.cpp
,输出将位于main.i
头文件不是自己编译的,只需想象文本实际上位于包含它的.cpp文件中。这个新的“合并”file是编译的。所以您可以将函数放在头文件中,当它包含在.cpp文件中时,它将被编译
原因很糟糕,如果你把它包含在第二个.CPP文件中,它会尝试重新编译,你会遇到问题。
头文件中函数定义的问题并不是被跳过。真正的风险是编译两次,这一次太多了。C++有一个叫做一个定义规则的东西,你违反了。通过编译一个函数两次来实现该规则
有一个重要的例外需要提及:内联
函数是免税的,可以在每个翻译单元中定义。头文件不会编译,除非通过#include
预处理拉入翻译单元。由于您唯一的.cpp文件没有此类包含,因此它不会编译,因此ava中没有任何内容我可以去那个(显然是你唯一的)翻译单位。