清单C常量/宏
有没有办法让GNU C预处理器、cpp(或其他一些工具)在C文件中列出所有可用宏及其给定点的值 我正在寻找特定于系统的宏,同时移植一个已经熟悉unix的程序并加载少量unix系统文件清单C常量/宏,c,gcc,c-preprocessor,C,Gcc,C Preprocessor,有没有办法让GNU C预处理器、cpp(或其他一些工具)在C文件中列出所有可用宏及其给定点的值 我正在寻找特定于系统的宏,同时移植一个已经熟悉unix的程序并加载少量unix系统文件 只是想知道是否有比寻找定义更简单的方法。为什么不查阅有关定义的部分?您是否需要此文件来构建项目或类似的东西?我不知道文件中的某个位置,但使用: $ touch emptyfile $ cpp -dM emptyfile 转储所有默认值。对C文件执行相同的操作时,其中的一些#include和#define行也包括所
只是想知道是否有比寻找定义更简单的方法。为什么不查阅有关定义的部分?您是否需要此文件来构建项目或类似的东西?我不知道文件中的某个位置,但使用:
$ touch emptyfile
$ cpp -dM emptyfile
转储所有默认值。对C文件执行相同的操作时,其中的一些#include
和#define
行也包括所有这些行。我想你可以把你的文件截短到你关心的地方,然后再做同样的事情
从:
-dCHARS
CHARS
是以下一个或多个字符的序列,前面不能有空格。其他字符由编译器本身解释,或保留给将来的GCC版本,因此被默默地忽略。如果指定行为冲突的字符,则结果未定义
M
为预处理器执行期间定义的所有宏(包括预定义宏)生成一个
#define
指令列表,而不是正常输出。这为您提供了一种查找预处理器版本中预定义内容的方法。假设您没有foo.h文件,则命令
touch foo.h; cpp -dM foo.h
将显示所有预定义的宏
如果使用-dM
而不使用-E
选项,-dM
将被解释为-fdump rtl mach
的同义词
D
与
M
类似,除了两个方面:它不包括预定义的宏,并输出#define
指令和预处理结果。这两种类型的输出都进入标准输出文件
N
与D类似,但只发出宏名称,而不发出它们的扩展名
I
输出
#除预处理结果外,还包括
指令
在宏文件中列出“C文件中给定点的值”,有两个可以显示C文件中的给定点,特别是在编译时,这将被认为是跟踪失败点的有用工具。在Foo.C:
文件中考虑这个示例代码。行号将根据使用该逻辑的源中的位置而有所不同。此示例用于显示可以在何处使用该宏…对于gcc,您可以使用“-dD”选项将所有宏定义转储到stdout。这里是一个页面,概述了命令行选项,以列出大多数编译器的预定义宏(
gcc
,clang
).一个有趣的问题。。。也许包括您的意图会让您得到更好的答案?是的,预定义宏是gcc手册的一个很好的部分,但我正在寻找特定于系统的宏,同时移植一个已经熟悉unix的程序并加载少量unix系统文件。只是想知道是否有比查找定义更简单的方法。@Michael,cpp-dM
没有文件名参数,在stdin
上等待数据。你可以这样做,然后键入^D
,但是创建一个空文件更容易。谢谢,我忘记了touch
是创建一个空文件的一个简单方法。不使用虚拟文件的最快/最简单的方法:gcc-dM-E-
@Paul R:cpp-dM/dev/null
对我有效。。。看起来更容易更快,至少考虑到打字的工作量…:-)@保罗R-真的很有趣gcc
给出/dev/null:无法识别文件:文件被截断
。顺便说一句,我在看答案时,忽略了您实际使用的是与答案不同的gcc-E
。关于\uuu STDC\uuuu
(gcc
4.6.1 forx86\u 64
)我没有发现任何区别……答案总是“-d”,这是5年前的答案,rtfm的亡灵巫师。我不明白这个答案的目的。
if (!(ptr = malloc(20))){
fprintf(stderr, "Whoops! Malloc Failed in %s at line %d\n", __FILE__, __LINE__);
}
Whoops! Malloc Failed in foo.c at line 25