宏有两大用途, 一是编码替换, 一是条件编译.
当阅读代码时,如果有很多条件编译宏,那对阅读者就是一种梦驿.
很多集成环境,很好的解决了条件宏问题. 它们令无效的语句为灰色.
但普通编辑器就没有这种能力了.
如果只有普通编辑器, 又想知道宏的情况,怎么办呢? ,找gcc 解决.
gcc 中的宏判别.
gcc -E -dM null.c 查看内置的宏定义
说明: 仅输出#define 命令, 输出简明.
缺点: 由于所有的宏只是简单的堆在一起,也包含内置的宏且不分组,显得多而杂乱.
适用于查找某个宏是否定义
gcc -E -dD null.c (define)与-dM 类似,但包含预处理指令
说明: 输出#define, 也输出预处理. 并且按文件分组显示.
缺点: 显得不够简明
适用于浏览某个文件定义了哪些宏
说明:所谓预处理,就是对包含的头文件进行了展开,并且行后面往往还跟着一串数字,
说明该行信息是一个新文件(1),又回到了该文件(2),此乃系统头文件(3),此为c代码快(4)
gcc -E -dU null.c (usage)与-dD 类似, 当使用时会判断宏是否定义
说明: 它并不输出#define 指令 及预处理指令,但是输出当你判断时宏是否已经定义.
定义过显示#define
未定义过显示#undef
适用于在一个文件中判别哪些宏定义过或未定义.
用它过滤出的文件, 跟集成环境的编辑器可以像比美了, 它直接过滤了无效的代码.
所以首次阅读大量带宏的c代码,
推荐用集成开发环境阅读.
也可以用gcc 预处理后阅读. (假设它可以用gcc编译)
小结: gcc -E 是简单的预处理,包含include处理,包含typedef 指令,但不包含#define, #undef 宏
gcc -E -dM 不是预处理, 仅包含宏
gcc -E -dD 即做预处理,也包含宏
gcc -E -dU 是预处理过滤输出,过滤了define 后的代码, undef部分被忽略.