为什么#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可能需要更昂贵的程序版本)等等。

使用它们有不同的原因。 例如,如果只需要包含一些库。 你可以定义一个宏。 然后检查是否已定义该宏,以便跳过包含。 等等。

这里有一个解释: 包含守卫

CC++编程语言中, #include保护(有时称为macro guard )是一种特殊的构造,用于避免在处理include伪指令时出现double inclusion问题。 将#include警卫添加到头文件是使该文件具有幂等性的一种方法。 例如,假设您要在child.h文件中包含grandfather.hfather.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的第二个定义。 程序编译正确。