Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
清单C常量/宏_C_Gcc_C Preprocessor - Fatal编程技术网

清单C常量/宏

清单C常量/宏,c,gcc,c-preprocessor,C,Gcc,C Preprocessor,有没有办法让GNU C预处理器、cpp(或其他一些工具)在C文件中列出所有可用宏及其给定点的值 我正在寻找特定于系统的宏,同时移植一个已经熟悉unix的程序并加载少量unix系统文件 只是想知道是否有比寻找定义更简单的方法。为什么不查阅有关定义的部分?您是否需要此文件来构建项目或类似的东西?我不知道文件中的某个位置,但使用: $ touch emptyfile $ cpp -dM emptyfile 转储所有默认值。对C文件执行相同的操作时,其中的一些#include和#define行也包括所

有没有办法让GNU C预处理器、cpp(或其他一些工具)在C文件中列出所有可用宏及其给定点的值

我正在寻找特定于系统的宏,同时移植一个已经熟悉unix的程序并加载少量unix系统文件


只是想知道是否有比寻找定义更简单的方法。

为什么不查阅有关定义的部分?您是否需要此文件来构建项目或类似的东西?

我不知道文件中的某个位置,但使用:

$ 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 for
x86\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