Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 未编译头文件(C+;+;Visual Studio 2015)_C++_Visual Studio 2015 - Fatal编程技术网

C++ 未编译头文件(C+;+;Visual Studio 2015)

C++ 未编译头文件(C+;+;Visual Studio 2015),c++,visual-studio-2015,C++,Visual Studio 2015,为了看看它是否能工作(我知道它的形式很糟糕),我在头文件中完全定义了一个函数,并在主cpp文件中为该函数做了相应的转发声明。C++函数不需要在它们使用的翻译单元中定义,因此为什么头文件几乎完全是向前声明(除了内联函数之外)。然而,当我试图编译这个项目时,它说有未解决的外部问题 当我将头文件的全部内容移动到源文件中(同时删除头文件)时,它编译得很好,并按预期执行。那么,在构建项目时头文件是不是没有编译,或者只是有一些我不知道的异常 此外,即使我只是在property explorer中转到头文件的

为了看看它是否能工作(我知道它的形式很糟糕),我在头文件中完全定义了一个函数,并在主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中没有任何内容我可以去那个(显然是你唯一的)翻译单位。