最好不要在头文件里定义变量,那是非常业余的行为

本文解析了在C/C++中变量定义与声明的区别,强调了在头文件中使用extern声明而非定义变量的重要性,避免了因重复定义导致的编译错误。

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

定义变量和声明变量的区别在于定义会产生内存分配的操作。
/*module1.h*/
int a = 1; /* 在模块1的.h文件中定义int a */

/*module1.c*/
#include "module1.h" /*在模块1中包含模块1的.h文件*/

/*module2.c*/
#include "module1.h" /*在模块2中包含模块1的.h文件*/

/*module3.c*/
#include "module1.h" /*在模块3中包含模块1的.h文件*/
以上的结果是在模块1、2、3中都定义了整型变量a,a在不同的模块中对应不同的地址单元,因为一旦包含.h,则定义一个a,编译器为之分配内存。换句话说就是这3个a是不同的a!从来就不需要这样的设计,因此编译器会捕捉到这种现象,并告诉你已经有一个a定义过了。

error LNK2005:  ... already defined in ... .obj  ;

fatal error LNK1169: one or more multiply defined symbols found  Error executing link.exe.  

```````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````

看到一个公司的编程规则:“禁止在头文件里定义变量”,因为在头文件里定义变量,若被其它.C文件包含会导致变量重复定义。不是有#ifndef 、#define和#endif来防止重复包含吗?怎么会重复定义呢?在C++类的头文件中都定义了变量,照这样说的话,岂不是都重复定义了?我有些迷茫了,望大虾指点迷津。

#ifndef, #define, #endif 只能防止一个c/cpp文件内重复包含头文件
多个c/cpp之间是独立的,不能互相阻止

在C++类的头文件中都定义了变量,照这样说的话,岂不是都重复定义了?
----------
只有定义类对象的时候,才会有变量对象
你公司说的 应该是全局变量之类

``````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````

全局变量一般在.cpp文件中定义,在头文件中定义extern 
头文件中应使用extern 关键字声明全局变量(不定义)
test.h文件
extern int a;

test.cpp文件
#include"test.h"
int a;

int main()
{
}

```````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````

1.两个文件:a.h, main.cpp. main.cpp中#include "a.h":
此方法最好不用,因为最好不要在头文件里定义变量:
(1)[a.h]:
int b;//只有一行,定义int变量
(2) [main.cpp]:
#include "a.h" //可以,但如果有其他.cpp文件引用a.h则重定义(多个.cpp中)出错.

main(){ ...}
----------------------------------------------------
2.在上面的基础上,在[main.cpp]中多加一个 #include "a.h",则重定义(一个.cpp中):
[main.cpp]:
#include "a.h" 
#include "a.h" //第二个,错误,变量b重定义
main(){ ...}
-------------------
头文件的卫士的目的正在于此,可防止一个.cpp(不是多个.cpp)中重定义.
所以可在a.h中加#ifndef #define #endif:
(1)[a.h]:
#ifndef HEADER_A
#define HEADER_A

int b; //定义int变量,不过最好不要这样,尽量不要在头文件里定义变量

#endif
----------------------------------------------------
3.以上都只有一个.cpp引用了a.h,如果还有其他.cpp引用a.h,则变量b重定义,出错.故可把b设为全局变量(用extern ),即只声明b,以便多个.cpp都可访问,然后在某一个.cpp中定义一下:
(1)[a.h]:
#ifndef HEADER_A
#define HEADER_A

extern int b; //声明int变量
#endif

(2) [a.cpp]:
#include "a.h" 

(3) [main.cpp]:
#include "a.h" 
#include "a.h" //可以,因为有头文件卫士

int b= 3;//要定义一下b,也可在a.cpp里定义,但只能在二个.cpp中选一个.cpp,并定义b
main(){ ...}


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值