如何从C代码生成#define值列表?

djs*_*djs 5 c gcc c-preprocessor

我的代码有很多复杂的#define错误代码,因为它们嵌套在几个级别上,所以它们不容易解码.

有没有任何优雅的方法我可以获得#defines列表及其最终数值(或者他们可能是什么)?

举个例子:

<header1.h>
#define CREATE_ERROR_CODE(class, sc, code) ((class << 16) & (sc << 8) & code)
#define EMI_MAX 16

<header2.h>
#define MI_1 EMI_MAX

<header3.h>
#define MODULE_ERROR_CLASS MI_1
#define MODULE_ERROR_SUBCLASS 1
#define ERROR_FOO CREATE_ERROR_CODE(MODULE_ERROR_CLASS, MODULE_ERROR_SUBCLASS, 1)
Run Code Online (Sandbox Code Playgroud)

我会有大量类似的#defines匹配ERROR _ [\ _ W _] +,我想枚举,以便我总是有一个程序可以输出的错误代码的当前列表.我需要数值,因为这是所有程序将打印出来的(不,它不是打印出字符串的选项).

对gcc或任何其他编译器的建议会有所帮助.

nmi*_*els 7

GCC的-dM 预处理器选项可能会让你得到你想要的.


ASh*_*lly 4

我认为解决方案是@nmichaels 和@aschepler 答案的组合。

使用 gcc 的 -dM 选项获取宏列表。使用 perl 或 awk 或其他任何工具从此列表中创建 2 个文件:

1) Macros.h,仅包含#defines。

2)Codes.c,其中包含

#include "Macros.h"

ERROR_FOO = "ERROR_FOO"
ERROR_BAR = "ERROR_BAR"
Run Code Online (Sandbox Code Playgroud)

(即:将每个内容提取#define ERROR_x到带有宏和字符串的行中。

现在运行gcc -E Codes.c。这应该创建一个扩展了所有宏的文件。输出应该类似于

1 = "ERROR_FOO"
2 = "ERROR_BAR"
Run Code Online (Sandbox Code Playgroud)

我手头没有 gcc,所以没有测试过......