列出 C 常量/宏

发布于 2024-08-24 20:33:42 字数 195 浏览 2 评论 0原文

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

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

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

Is there a way to make the GNU C Preprocessor, cpp (or some other tool) list all available macros and their values at a given point in a C file?

I'm looking for system-specific macros while porting a program that's already unix savvy and loading a sparse bunch of unix system files.

Just wondering if there's an easier way than going hunting for definitions.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

洛阳烟雨空心柳 2024-08-31 20:33:42

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

$ touch emptyfile
$ cpp -dM emptyfile

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

手册页

-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 类似,但仅发出宏名称,而不发出它们的扩展。


除了预处理结果之外,还输出 #include 指令。

I don't know about a certain spot in a file, but using:

$ touch emptyfile
$ cpp -dM emptyfile

Dumps all the default ones. Doing the same for a C file with some #include and #define lines in it includes all those as well. I guess you could truncate your file to the spot you care about and then do the same?

From the man page:

-dCHARS
CHARS is a sequence of one or more of the following characters, and must not be preceded by a space. Other characters are interpreted by the compiler proper, or reserved for future versions of GCC, and so are silently ignored. If you specify characters whose behavior conflicts, the result is undefined.

M
Instead of the normal output, generate a list of #define directives for all the macros defined during the execution of the preprocessor, including predefined macros. This gives you a way of finding out what is predefined in your version of the preprocessor. Assuming you have no file foo.h, the command

    touch foo.h; cpp -dM foo.h

will show all the predefined macros.

If you use -dM without the -E option, -dM is interpreted as a synonym for -fdump-rtl-mach.

D
Like M except in two respects: it does not include the predefined macros, and it outputs both the #define directives and the result of preprocessing. Both kinds of output go to the standard output file.

N
Like D, but emit only the macro names, not their expansions.

I
Output #include directives in addition to the result of preprocessing.

半山落雨半山空 2024-08-31 20:33:42

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

With gcc, you can use the "-dD" option to dump all the macro definitions to stdout.

三生池水覆流年 2024-08-31 20:33:42

为什么不参考预定义宏部分?您需要这个来构建项目或类似的东西吗?

Why not consult the section on Predefined-macros? Do you need this for building a project or some such thing?

野鹿林 2024-08-31 20:33:42

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

if (!(ptr = malloc(20))){
    fprintf(stderr, "Whoops! Malloc Failed in %s at line %d\n", __FILE__, __LINE__);
}

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

Whoops! Malloc Failed in foo.c at line 25

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

To list "their values at a given point in a C file" using macros, there is two that can demonstrate a given point in a C file, especially when compiled, and would be deemed useful for tracing a point of failure...consider this sample code in a file called foo.c:

if (!(ptr = malloc(20))){
    fprintf(stderr, "Whoops! Malloc Failed in %s at line %d\n", __FILE__, __LINE__);
}

If that code logic was used several times in this file, and the call to malloc was failing, you would get this output:

Whoops! Malloc Failed in foo.c at line 25

The line number would be different depending on where in the source, that logic is used. This sample serves the purpose in showing where that macro could be used...

迷鸟归林 2024-08-31 20:33:42

这是链接,指向包含命令行概述的页面用于列出大多数编译器的预定义宏的选项(gccclang...)。

Here is a link to a page with an overview of command-line options to list predefined macros for most compilers (gcc, clang...).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文