之前在这篇文章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
这句话,在之前都是这样手写的:
#ifndef XX_H
#define XX_H
#endif
你随便搜索下这句代码的作用,大概都像下面说的这样:

本文探讨了在VS2017中C++开发时遇到的头文件重复定义问题,包括由变量和函数引起的重复定义错误。作者解释了#pragma once和#ifdef的作用,以及如何避免头文件中的重复编译问题。文章还提到了类在头文件中的声明与定义的特例,并建议了编写头文件的规范,以防止重定义和提高编译效率。
头文件与重复定义符号&spm=1001.2101.3001.5002&articleId=84112301&d=1&t=3&u=33391095f3fe4d23956082043d735959)
764

被折叠的 条评论
为什么被折叠?



