为什么#define是一个空宏?

Den*_*nly 7 c

为什么有时我会看到

#define __Empty_macro__
Run Code Online (Sandbox Code Playgroud)

在c?它的用途是什么?恩.

#ifndef _BUILDIN_H_
#define _BUILDIN_H_

//codes never used _BUILDIN_H_ ...

#endif /* _BUILDIN_H_ */
Run Code Online (Sandbox Code Playgroud)

ex source是一个shell工具:https://github.com/dingdongnigetou/shell/blob/master/include/build_in.h

小智 8

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

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

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

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


gra*_*upa 5

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

这里有一个关于的解释:包含卫队


abh*_*ora 4

CC++编程语言中,#include防护(有时称为 )是一种特殊的构造,用于避免处理 include 指令时出现macro guard的问题。double inclusion在头文件中添加 #include 保护是使该文件幂等的​​一种方法。例如,考虑您想要在文件中包含grandfather.hfather.h文件child.h

文件“祖父.h”

#ifndef GRANDFATHER_H
#define GRANDFATHER_H

struct foo {
   int member;
};

#endif /* GRANDFATHER_H */
Run Code Online (Sandbox Code Playgroud)

文件“父亲.h”

#include "grandfather.h"
Run Code Online (Sandbox Code Playgroud)

文件“child.c”

#include "grandfather.h"
#include "father.h"
Run Code Online (Sandbox Code Playgroud)

在这里,第一次包含"grandfather.h"导致宏GRANDFATHER_H被定义。然后,当“child.c”通过 include 第二次包含“grandfather.h”(也father.h包含grandfather.h)时father.h#ifndef测试返回 false,预处理器跳到文件的#endif grandfather.h,从而避免了 struct 的第二次定义富。并且程序编译正确。