VS2017的C++开发心得(十)头文件与重复定义符号

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前在这篇文章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

这句话,在之前都是这样手写的:<

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值