为什么有时我会看到
#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仅仅被定义的宏可以改变程序输出,例如通过包括在最终产品中不期望的更昂贵的运行时检查,但是可以帮助跟踪开发期间的错误.
可以类似地使用自定义"空"定义来包括或排除程序构建中的某些二进制功能.这可以用于性能(删除日志记录),安全性(删除程序的敏感部分),业务原因(某些功能可能需要更昂贵的程序版本)等等.
在C和C++编程语言中,#include防护(有时称为 )是一种特殊的构造,用于避免处理 include 指令时出现macro guard的问题。double inclusion在头文件中添加 #include 保护是使该文件幂等的一种方法。例如,考虑您想要在文件中包含grandfather.h头father.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 的第二次定义富。并且程序编译正确。
| 归档时间: |
|
| 查看次数: |
1682 次 |
| 最近记录: |