C++ 之重定义问题

本文详细解析了在C++编程中头文件重复包含导致的重定义问题,阐述了条件编译和#pragmaonce指令的使用方法来避免此问题,并讨论了其在编译和链接环节的影响。

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

1、问题描述

如果定义了头文件A.h,B.h和源文件C.cpp。如果我们在A.h中写上一个函数,在B.h中include A.h,然后再在C.cpp中include A.h和B.h,这样我们就会出现重复定义的问题。

 

2、解决方法

重定义问题的原因往往是头文件的重复包含,常规解决方法如下:

  • 条件编译

该方法的原理是在当编译器遇到第2(3,....)遍同样的头文件时,因为已经编译了一次,在后面在遇到的时候,编译器自动忽略文件中的内容。

#ifndef  ...

#define ...

#endif ...

  • #pragma once

 

3、其他情况

#ifndef...#endif 和 #pragma once 并不能完全消除所有的重定义问题。

重定义问题可能会出现在编译环节和链接环节。

  • 编译环节:条件编译定义宏,防止某个cpp文件多次包含同一个.h(直接/间接),保证编译环节不会出现重复头文件。
  • 链接环节:如果在头文件中定义了变量(该做法是错误的!),在多个cpp文件中包含,编译时会有多个.o文件中有这个变量,所以在链接环节会出错。

 

建议:函数和变量最好在头文件中声明,cpp中定义。

 

 

参考:

https://www.cnblogs.com/geore/p/5803944.html

https://bbs.youkuaiyun.com/topics/391067362?page=1

https://blog.youkuaiyun.com/hust_sheng/article/details/50822410

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值