实例
产生原因:VS2019抽风,将头文件也进行了编译。属于偶发bug,不易复现。
如图所示的Visual Studio工程,各文件源代码内容如下:
// main.cpp
#include <iostream>
#include "star.h"
int main()
{
DoIt();
std::cout << "Hello World!\n";
}
// star.h
#pragma once
#include<iostream>
using namespace std;
void DoIt();
//star.cpp
#include"star.h"
void DoIt()
{
for (int j = 0; j < 10; j++)
{
for (int i = 0; i < 10; i++)
{
cout << "* ";
}
cout << endl;
}
}
这样一个程序,理应正常运行并且输出。
但是,它却报了链接错误。这让人百思不得其解。最后,去翻看.vcxproj
文件和.filter
文件才发现,star.h
居然被当作了源文件也进行了编译、链接,如图所示:
图中红框标出来的地方是不合理的。本来,添加在头文件里的star.h
应该如下表现:
所以在VS中将star.h
移除又重新添加到头文件中后,程序就一切正常了。
启发
如果反复检查头文件和对应的源文件,都在VS中正确添加,则应当在文本编辑器中打开当前工程的***.vcxproj
文件,直接看最后一段内容:
ItemGroup
标签内部的内容:是否所有的.h
标头文件都是由ClInclude
标记的;是否所有的.cpp
标头文件都是由ClCompile
标记的。否则应该更改为对应的正确标记。