是未编译的标头文件(C Visual Studio 2015)
Are header files not compiled (C++ Visual Studio 2015)
只是为了查看它是否有效(我知道这很糟糕),我在标头文件中完全定义了一个函数,并在主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
函数是豁免的,并且可以在每个翻译单元中定义。
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 试图在visual studio上用C++创建一个桌面应用程序
- 如何在MS Visual Studio 2019中运行QT UI
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- Visual Studio Code - C++ Debugger 無法啟動
- Visual Studio 2019:插入多个C++风格的单行注释
- Visual Studio Code "undefined reference to `WinMain@16'"
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- Visual Studio中的函数声明和函数定义问题
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- Visual Studio mkl_link_tool.exe链接错误
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 不同的Visual Studio版本中缺少.dll
- 用Visual Studio在C++中嵌入Julia
- Visual Studio 2017循环自动向量化问题
- 有没有办法在远程设备上打开和编辑visual Studio 2017解决方案
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- Visual Studio在尝试读取resource.txt文件时崩溃
- Visual Studio 2017 不允许我创建 C++ 专用模板