使用可变参数宏动态地为宏名称添加前缀

时间:2017-11-29 16:10:05

标签: c gcc macros c-preprocessor hygiene

背景

我的来源中的

I've utilized a set of preprocessor macros from another question that allows me to prefix symbol names(枚举,函数名,结构名等),即:

i is 123 in func_3.

问题

这可以按预期工作,输出如下:#define NAME(SOME_MACRO_CONST) (123) #define NAME(SOME_MACRO_CONST2) (123)

修改

我想要这段代码:

#define 3SOME_MACRO_CONST  (123)
#define 3SOME_MACRO_CONST2 (123)

扩展为:

LIB_A_

我意识到宏不应该以数字开头。在最终的代码中,我将使用LIB_B_NAME等名称作为前缀。

/编辑

但是,如果我尝试使用宏作为我的NAME可变参数宏的参数,它就会失败:

重新使用#define NAME(MY_CONST) (3) 宏:

代码

test.c:7:0: warning: "NAME" redefined
 #define NAME(MY_CONST) 3

输出

#define VARIABLE ## MY_CONST    (3)

手动粘贴前缀:

代码:

test.c:8:18: error: '##' cannot appear at either end of a macro expansion
 #define VARIABLE ## MY_CONST (3)

输出:

td

问题

如何创建具有所有宏的公共前缀的简单宏定义(名称+值)?目标是能够制作源文件的多个副本并使用不同的标志编译它们,这样所有版本都可以链接到同一个最终二进制文件中,而不会发生符号/宏名称冲突(以后宏将被移动到头文件中)。最终文件太大,无法用M4或模板语言编写。 理想情况下,该解决方案将涉及能够为所有用例使用单个宏函数/可变参数宏,但我可以使用一个宏进行符号前缀,另一个用于宏名称前缀。< /强>

0 个答案:

没有答案