为什么#define是一个空宏?

时间:2016-04-24 00:13:30

标签: c

为什么有时候我会看到

#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

3 个答案:

答案 0 :(得分:8)

因为“空宏”仍然存在,并且可以使用#ifdef#ifndef检查它们是否存在。

通常,此行为用于防止包含相同标头的多个副本(也就是“包含警卫”,这就是您的示例)。但是,它也可以用于有条件地包含程序的某些部分。

有时,仅定义NDEBUG_DEBUG的宏可以改变程序输出,例如通过包含更昂贵的运行时检查,这在最终产品中是不合需要的,但可以帮助跟踪开发期间的错误

可以类似地使用自定义“空”定义来包括或排除程序构建中的某些二进制功能。这可以用于性能(删除日志记录),安全性(删除程序的敏感部分),业务原因(某些功能可能需要更昂贵的程序版本)等等。

答案 1 :(得分:4)

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

这里有一个关于:inclusion guard

的解释

答案 2 :(得分:3)

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