C/C++中#ifndef的用法

如下所示,代码中为什么要有这样的结构呢?

编写头文件test.h时,在头文件开头写上两行,如下:
#ifndef __TEST_H
#define __TEST_H
"
...... #内容
......
"
头文件结尾写上一行:
#endif

这是因为:防止文件中的内容被重复定义
我们来看下面这样一个例子,定义了main.cpp,a.h,b.h,c.h,其中main.cpp包含了a.h和b.h,a.h包含了c.h,b.h也包含了c.h。

main.cpp

a.h

b.h

c.h

这样编译是无法通过的,因为在编译main.cpp时先运行#include "a.h",此时编译了a.h中的c.h,也即给int a变量做了定义,后运行到#include "b.h",此时编译了b.h中的c.h,又给int a进行了重定义,所以报了重定义的错误:
发生重定义错误

解决的方法就是,使用#ifndef系列语句块将c.h中的int a = 10;这一语句包装起来,包装结果如下:

#ifndef UNTITLED2_C_H
#define UNTITLED2_C_H
int a = 10;
#endif //UNTITLED2_C_H

这样就可以通过编译,main.cpp文件也可以正常运行了。所以我们在编写头文件时,尽量将所有语句放在#ifndef语句块中,防止重定义报错。至于命名规则,通常#ifndef以及#define后面接的是头文件名称的全部字符大写,如#ifndef __C_H,当然也可以自行任意命名,为编译器添加一个可识别的标签即可

参考链接:#ifndef用法_william_hehe的博客-CSDN博客

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容