对全局变量的multiple definition的一点理解

本文解答了一个关于在头文件中定义全局变量导致多个定义错误的问题。解释了条件编译的作用范围及正确做法,即在一个源文件中定义全局变量,并在其他需要使用的源文件中通过extern进行声明。

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

来自这个帖
[在头文件中中定义全局变量的问题]
http://bbs.youkuaiyun.com/topics/390762077

Q:使用#ifndef在头文件中定义全局变量,然后两个.c文件分别访问(#include),编译时就会出现multiple definition的提示,但是已经使用了条件编译,理论上第二次应该跳过定义过程,这是为什么呢?

A:这类条件编译是为了防止同一个.c文件包含同一个头文件多次。
楼主要明白:每一个.c文件最后都会编译生成对应的.obj文件的。所以你的两个.c文件对应的两个.obj文件都会有你说的那个全局变量的,链接的时候,链接器就会发现有定义了两个同名变量,于是就报multiple definition错误。
正确的做法是:是其中一个.c文件定义这个变量,在另外一个.c文件用extern声明

也就是确保只定义一次,而声明则可以多次
因为头文件很容易被不同的.c文件include,生成多个.obj目标文件,因此正确的做法就是不要在头文件中定义全局变量,而应该在.c/.cpp文件中定义

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值