为什么#define是一个空宏?
为什么我有时会看到
#define __Empty_macro__
在c? 它的用途是什么? 恩。
#ifndef _BUILDIN_H_ #define _BUILDIN_H_ //codes never used _BUILDIN_H_ ... #endif /* _BUILDIN_H_ */
ex source是一个shell工具: https : //github.com/dingdongnigetou/shell/blob/master/include/build_in.h
因为“空宏”仍然存在,并且可以使用#ifdef
或#ifndef
检查它们是否存在。
通常,此行为用于防止包含相同标头的多个副本(也就是“包含警卫”,这就是您的示例)。 但是,它也可以用于有条件地包括程序的某些部分。
有时,仅定义NDEBUG
或_DEBUG
类的宏可以改变程序输出,例如通过包含更昂贵的运行时检查,这在最终产品中是不合需要的,但可以帮助跟踪开发期间的错误。
可以类似地使用自定义“空”定义来包括或排除程序构建中的某些二进制function。 这可以用于性能(删除日志记录),安全性(删除程序的敏感部分),业务原因(某些function可能需要更昂贵的程序版本)等等。
使用它们有不同的原因。 例如,如果只需要包含一些库。 你可以定义一个宏。 然后检查是否已定义该宏,以便跳过包含。 等等。
这里有一个解释: 包含守卫
在C
和C++
编程语言中, #include
保护(有时称为macro guard
)是一种特殊的构造,用于避免在处理include伪指令时出现double inclusion
问题。 将#include警卫添加到头文件是使该文件具有幂等性的一种方法。 例如,假设您要在child.h
文件中包含grandfather.h
和father.h
头文件。
档案“grandfather.h”
#ifndef GRANDFATHER_H #define GRANDFATHER_H struct foo { int member; }; #endif /* GRANDFATHER_H */
档案“father.h”
#include "grandfather.h"
文件“child.c”
#include "grandfather.h" #include "father.h"
这里,第一次包含"grandfather.h"
会导致定义宏GRANDFATHER_H
。 然后,当“child.c”包含“grandfather.h”时,第二次(作为father.h
还包括grandfather.h
)通过包含father.h
, #ifndef
测试返回false,预处理器跳转到#endif grandfather.h
文件,因此避免了struct foo的第二个定义。 程序编译正确。