是未编译的标头文件(C Visual Studio 2015)

Are header files not compiled (C++ Visual Studio 2015)

本文关键字:Visual Studio 2015 文件 编译      更新时间:2023-10-16

只是为了查看它是否有效(我知道这很糟糕),我在标头文件中完全定义了一个函数,并在主CPP文件中对上述函数进行了相应的向前声明。C 函数不需要在其使用的翻译单元中定义,因此,为什么标头文件几乎完全只是向前声明(外线功能除外)。但是,当我试图编译该项目时,它说尚未解决外部。

当我将标头文件的整个内容移入源文件(也删除标头文件)时,它按预期进行了很好的编译并执行。因此,在构建项目时,标题文件是没有编译的,还是我不知道的例外?

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

(我正在使用扩展程序禁用/Za,如果有任何更改)

这是代码文件

//main.cpp
void foo();
void main()
{
    foo();
}

和标头文件

//test.h
#include <iostream>
void foo()
{
    std::cout << 'a';
}

标题文件由预处理器包含在编译单元-cpp文件中。此后,编译器编译了cpp文件中的源代码。

将功能定义放入标题.h文件时。您不会将此标头文件包含在main.cpp中,并且编译器不会编译它,因为预处理器不包括在main.cpp中。

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

标题文件不是自己编译的,请想象文本实际上位于.cpp文件中,其中包含该文件。这个新的"合并"文件是所编译的。因此,您可以将函数放在标题文件中,并且将其包含在.cpp文件中时会进行编译。

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

标题中功能定义的问题不是被跳过。真正的风险是它们两次汇编,这曾经太多了。C 具有称为一个定义规则的东西,您通过两次编译单个功能来违反该规则。

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