【发布时间】:2010-03-10 23:36:52
【问题描述】:
有没有办法让 GNU C 预处理器、cpp(或其他一些工具)在 C 文件?
我正在寻找特定于系统的宏,同时移植一个已经精通 unix 的程序并加载一堆稀疏的 unix 系统文件。
只是想知道是否有比寻找定义更简单的方法。
【问题讨论】:
-
一个有趣的问题......也许包括你的意图会给你一个更好的答案?
标签: c gcc c-preprocessor
有没有办法让 GNU C 预处理器、cpp(或其他一些工具)在 C 文件?
我正在寻找特定于系统的宏,同时移植一个已经精通 unix 的程序并加载一堆稀疏的 unix 系统文件。
只是想知道是否有比寻找定义更简单的方法。
【问题讨论】:
标签: c gcc c-preprocessor
我不知道文件中的某个位置,但使用:
$ touch emptyfile
$ cpp -dM emptyfile
转储所有默认值。对包含 #include 和 #define 行的 C 文件执行相同操作也包括所有这些行。我想您可以将文件截断到您关心的位置,然后做同样的事情?
来自man page:
-dCHARSCHARS是以下一个或多个字符的序列,前面不能有空格。其他字符由编译器正确解释,或为 GCC 的未来版本保留,因此被忽略。如果指定行为冲突的字符,则结果未定义。
M
代替正常输出,为预处理器执行期间定义的所有宏(包括预定义的宏)生成#define指令列表。这为您提供了一种查找预处理器版本中预定义内容的方法。假设你没有文件 foo.h,命令touch foo.h; cpp -dM foo.h将显示所有预定义的宏。
如果您使用
-dM而不使用-E选项,-dM将被解释为-fdump-rtl-mach的同义词。
D
与M类似,除了两个方面:它不包含预定义的宏,并且输出#define指令和预处理结果。两种输出都进入标准输出文件。
N
与 D 类似,但只发出宏名称,而不是它们的扩展。
I
除预处理结果外,还输出#include指令。
【讨论】:
cpp -dM 没有文件名参数等待 stdin 上的数据。你可以这样做然后输入^D,但是创建一个空文件更容易。
touch 是一种创建空文件的简单方法。
gcc -dM -E - < /dev/null
cpp -dM /dev/null 为我工作...似乎更容易和更快,至少考虑到打字工作... :-)
gcc 给 /dev/null: file not recognized: File truncated。顺便说一句,我正在查看答案,忽略了您实际上使用的是 gcc -E 与答案不同。关于__STDC__(gcc 4.6.1 for x86_64),我没有发现任何区别。
使用 gcc,您可以使用“-dD”选项将所有宏定义转储到标准输出。
【讨论】:
为什么不参考Predefined-macros 部分?您是否需要它来构建项目或类似的东西?
【讨论】:
要使用宏列出“它们在 C 文件中给定点的值”,有两个可以演示 C 文件中的给定点,尤其是在编译时,并且被认为对跟踪故障点很有用。 ..在一个名为 foo.c 的文件中考虑这个示例代码:
if (!(ptr = malloc(20))){ fprintf(stderr, "哎呀!Malloc 在第 %d\n 行的 %s 中失败", __FILE__, __LINE__); }如果该代码逻辑在此文件中多次使用,并且对 malloc 的调用失败,您将获得以下输出:
行号会有所不同,具体取决于源中使用该逻辑的位置。此示例的目的是显示可以在何处使用该宏...
【讨论】:
这是一个link 到一个页面,其中概述了用于列出大多数编译器(gcc、clang...)的用于列出预定义宏的命令行选项。
【讨论】: