为什么有时候我会看到
#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
答案 0 :(得分:8)
因为“空宏”仍然存在,并且可以使用#ifdef
或#ifndef
检查它们是否存在。
通常,此行为用于防止包含相同标头的多个副本(也就是“包含警卫”,这就是您的示例)。但是,它也可以用于有条件地包含程序的某些部分。
有时,仅定义NDEBUG
或_DEBUG
的宏可以改变程序输出,例如通过包含更昂贵的运行时检查,这在最终产品中是不合需要的,但可以帮助跟踪开发期间的错误
可以类似地使用自定义“空”定义来包括或排除程序构建中的某些二进制功能。这可以用于性能(删除日志记录),安全性(删除程序的敏感部分),业务原因(某些功能可能需要更昂贵的程序版本)等等。
答案 1 :(得分:4)
使用它们有不同的原因。 例如,如果只需要包含一些库。你可以定义一个宏。然后检查是否已定义该宏,以便跳过包含。等等。
这里有一个关于:inclusion guard
的解释答案 2 :(得分:3)
在C
和C++
编程语言中,#include
后卫(有时称为macro guard
)是用于避免double inclusion
问题的特定构造处理include指令时。将#include guards添加到头文件是使该文件具有幂等性的一种方法。例如,假设您要在grandfather.h
文件中包含father.h
和child.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 {{ 1}},从而避免了struct foo的第二个定义。程序编译正确。