有#define保护 为什么仍不能在头文件中定义变量

问题导入

首先,不能在头文件中定义变量,该规定并不是由于C语言标准限制,不允许在头文件中定义变量。而是编译器本身产生了重复定义的错误。

写了#ifndef #define #endif这样的头文件保护命令,为什么还是不能在头文件中定义变量?这是对头文件保护命令理解的偏差。

问题解决

#ifndef,#ifndef只是预编译,还没有开始真正的编译。这些命令只能防止同一个编译单元下,重复include同一个头文件而导致的重复定义。

当一个C或者CPP文件在编译之前,预处理器会首先递归包含头文件,形成一个含有所有必要信息的单个源文件,这个源文件就是一个编译单元,一般来说,一个C或CPP文件就是一个编译单元。

示例:

1

头文件(test.h):

#ifndef _TEST_H_  
#define _TEST_H_  
int i;  
#endif  

文件1(file1.c):

#include "test.h"  
#include "test.h"  

void main()  
{  
    i = 0;  
}  

这时如果编译,不会产生任何问题。
因为这是一个编译单元,编译器在第一次定义了_TEST_H_之后,就不会再去定义,也就不会重复定义变量i。


2

但如果是下面这种情况,编译器就会报错;

头文件(test2.h):

#ifndef _TEST_H_  
#define _TEST_H_  
int i; 
void add(void); 
#endif  

文件1(test1.c):

#include "test2.h"  
  
void main()  
{  
    i = 0;
    add();  
}  

文件2(test2.c):

#include "test2.h"  
  
void add()  
{  
   i++;  
}  

这时编译就会报错,因为test1.c和test2.c会产生两个编译单元,在每个编译单元中都会有一个被定义的i,在链接时,编译器就会产生错误。

总结

所以,为了避免上述情况的发生,我们不在头文件中定义变量。
如果一个变量需要被多个C文件使用,就采用在C文件中定义的方式,并在这个C文件的对应头文件中加extern声明。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值