之前在这篇文章VS2017的C++开发心得(四)VS的文件夹路径以及项目生成步骤中谈到过关于在cpp中定义相同类型变量名导致的重复定义。
先看下什么是符号,我在main.cpp中定义了一个int test,同时又在a.cpp中定义了一个int test,编译会出现链接错误如下:
从上图可知,符号是由变量名和类型共同组成的,所以如果我a.cpp中定义的是
int test()
{
return 1;
}
它的符号是这样的?test@@YAHXZ,所以是不会冲突的,编译可以顺利通过。只是由于你main.cpp中已经使用test当做变量名了,你就无法通过extern引用a.cpp中的 int test()这个函数。这个呢,我认为从编译原理上是可以引用的,只是VS不让你这么写代码而已,毕竟你编译的符号又不冲突。
上面说的是由于cpp中定义而导致的重复定义问题,下面谈谈由于头文件导致的重复定义问题,以及头文件防止重复编译是否真的有效果。
VS2017的头文件都默认有这么一句代码:
#pragma once
这句话,在之前都是这样手写的:<