【问题标题】:Listing C Constants/Macros列出 C 常量/宏
【发布时间】:2010-03-10 23:36:52
【问题描述】:

有没有办法让 GNU C 预处理器、cpp(或其他一些工具)在 C 文件?

我正在寻找特定于系统的宏,同时移植一个已经精通 unix 的程序并加载一堆稀疏的 unix 系统文件。

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

【问题讨论】:

  • 一个有趣的问题......也许包括你的意图会给你一个更好的答案?

标签: c gcc c-preprocessor


【解决方案1】:

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

$ touch emptyfile
$ cpp -dM emptyfile

转储所有默认值。对包含 #include#define 行的 C 文件执行相同操作也包括所有这些行。我想您可以将文件截断到您关心的位置,然后做同样的事情?

来自man page

-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
除预处理结果外,还输出#include 指令。

【讨论】:

  • @Michael, cpp -dM 没有文件名参数等待 stdin 上的数据。你可以这样做然后输入^D,但是创建一个空文件更容易。
  • 谢谢,我忘了touch 是一种创建空文件的简单方法。
  • 不使用虚拟文件的最快/最简单的方法:gcc -dM -E - < /dev/null
  • @Paul R:cpp -dM /dev/null 为我工作...似乎更容易和更快,至少考虑到打字工作... :-)
  • @Paul R - 确实很有趣; gcc/dev/null: file not recognized: File truncated。顺便说一句,我正在查看答案,忽略了您实际上使用的是 gcc -E 与答案不同。关于__STDC__gcc 4.6.1 for x86_64),我没有发现任何区别。
【解决方案2】:

使用 gcc,您可以使用“-dD”选项将所有宏定义转储到标准输出。

【讨论】:

    【解决方案3】:

    为什么不参考Predefined-macros 部分?您是否需要它来构建项目或类似的东西?

    【讨论】:

    • 是的 predefined macros 是 gcc 手册的一个很好的部分,但我正在寻找特定于系统的宏,同时移植一个已经精通 unix 的程序并加载一个稀疏的一堆Unix 系统文件。只是想知道是否有比寻找定义更简单的方法。
    【解决方案4】:

    要使用宏列出“它们在 C 文件中给定点的值”,有两个可以演示 C 文件中的给定点,尤其是在编译时,并且被认为对跟踪故障点很有用。 ..在一个名为 foo.c 的文件中考虑这个示例代码:

    if (!(ptr = malloc(20))){ fprintf(stderr, "哎呀!Malloc 在第 %d\n 行的 %s 中失败", __FILE__, __LINE__); }

    如果该代码逻辑在此文件中多次使用,并且对 malloc 的调用失败,您将获得以下输出:

    哎呀! Malloc 在第 25 行的 foo.c 中失败

    行号会有所不同,具体取决于源中使用该逻辑的位置。此示例的目的是显示可以在何处使用该宏...

    【讨论】:

      【解决方案5】:

      这是一个link 到一个页面,其中概述了用于列出大多数编译器(gccclang...)的用于列出预定义宏的命令行选项

      【讨论】:

      • ...答案总是“-d” 这已经在 5 年前回答了,rtfm 的死灵法师。我想念这个答案的目的。
      猜你喜欢
      • 2022-01-02
      • 2015-08-03
      • 2011-03-14
      • 2011-04-26
      • 1970-01-01
      • 2023-04-09
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多