关于为什么不能在头文件中包含变量定义的解释
2018-03-10 16:07
281 查看
其实,并不是C语言标准不允许在头文件中包含变量定义,而是编译器本身产生了重复定义的错误。 这时候有些人会很奇怪,我不是写了#ifndef #define #endif这样的命令了吗?
如果你这样以为,就和笔者一开始犯了同样的错误,没有深入地理解#ifndef,#ifndef只是预编译,还没有开始真正的编译,他只能防止同一个编译单元下,重复include同一个头文件而导致的重复定义。 当一个C或者CPP文件在编译之前,预处理器会首先递归包含头文件,形成一个含有所有必要信息的单个源文件,这个源文件就是一个编译单元,一般来说,一个C或CPP文件就是一个编译单元。 让我们看一下示例
头文件(test.h):[cpp] view plain copy#ifndef _TEST_H_
#define _TEST_H_
int i;
#endif
文件1(file1.c):[cpp] view plain copy#include "test.h"
#include "test.h"
void main()
{
i = 0;
}
这时如果你编译是不会产生任何问题的,因为这是一个编译单元,编译器在第一次定义了_TEST_H_之后,就不会再去定义,也就不会重复定义变量i,但如果是下面这种情况,编译器就会报错;头文件(test2.h):[cpp] view plain copy#ifndef _TEST_H_
#define _TEST_H_
int i;
void add(void);
#endif
文件1(test1.c):[cpp] view plain copy#include "test2.h"
void main()
{
i = 0;
add();
}
文件2(test2.c):[cpp] view plain copy#include "test2.c"
void add()
{
i++;
}
这是编译就会报错,因为test1.c和test2.c会产生两个编译单元,在每个编译单元中都会有一个被定义的i,在链接时,编译器就会产生错误。
所以,为了避免上述情况的发生,我们不在头文件中定义变量。如果你想一个变量被多
a29c
个C文件使用,那么就在C文件中定义好,并在这个C文件的头文件中,使用extern声明一下。
如果你这样以为,就和笔者一开始犯了同样的错误,没有深入地理解#ifndef,#ifndef只是预编译,还没有开始真正的编译,他只能防止同一个编译单元下,重复include同一个头文件而导致的重复定义。 当一个C或者CPP文件在编译之前,预处理器会首先递归包含头文件,形成一个含有所有必要信息的单个源文件,这个源文件就是一个编译单元,一般来说,一个C或CPP文件就是一个编译单元。 让我们看一下示例
头文件(test.h):[cpp] view plain copy#ifndef _TEST_H_
#define _TEST_H_
int i;
#endif
文件1(file1.c):[cpp] view plain copy#include "test.h"
#include "test.h"
void main()
{
i = 0;
}
这时如果你编译是不会产生任何问题的,因为这是一个编译单元,编译器在第一次定义了_TEST_H_之后,就不会再去定义,也就不会重复定义变量i,但如果是下面这种情况,编译器就会报错;头文件(test2.h):[cpp] view plain copy#ifndef _TEST_H_
#define _TEST_H_
int i;
void add(void);
#endif
文件1(test1.c):[cpp] view plain copy#include "test2.h"
void main()
{
i = 0;
add();
}
文件2(test2.c):[cpp] view plain copy#include "test2.c"
void add()
{
i++;
}
这是编译就会报错,因为test1.c和test2.c会产生两个编译单元,在每个编译单元中都会有一个被定义的i,在链接时,编译器就会产生错误。
所以,为了避免上述情况的发生,我们不在头文件中定义变量。如果你想一个变量被多
a29c
个C文件使用,那么就在C文件中定义好,并在这个C文件的头文件中,使用extern声明一下。
相关文章推荐
- 全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?
- 关于头文件中定义的全局变量的包含
- 关于头文件中定义的全局变量的包含
- 头文件为什么不能定义变量
- 关于头文件中为什么定义的变量用extern关键字
- 每日一题(31)—— 全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?
- 头文件中只能声明变量不能定义变量 而声明变量必须带extern,为什么头文件中变量的声明都没有加
- 关于C++ 类数据成员初始化的一点总结【为什么类定义中不能初始化成员变量】
- 关于头文件中定义的全局变量的包含
- 为什么.h文件中不能定义全局变量
- 关于头文件中定义的全局变量的包含
- 关于头文件定义全局变量等问题
- 防止变量重复定义、头文件重复包含、嵌套包含
- 防止变量重复定义、头文件重复包含、嵌套包含
- 多次包含同一个头文件,实现只写一句宏定义就可以定义出两个不同类型的变量
- 防止变量重复定义、头文件重复包含、嵌套包含
- 关于为什么不能在vc6.0中引入cpp文件
- keil 中——C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法
- const定义的全局变量不能被其他文件访问,必须加extern 才能被访问吗?
- 防止头文件重复包含引起的变量重复定义