背景
我使用了另一个问题中的一组预处理器宏,这些宏允许我在源代码中为符号名称(枚举、函数名称、结构名称等)添加前缀,即:
#include <stdio.h>
#define VARIABLE 3
#define PASTER(x,y) x ## _ ## y
#define EVALUATOR(x,y) PASTER(x,y)
#define NAME(fun) EVALUATOR(fun, VARIABLE)
void NAME(func)(int i);
int main(void)
{
NAME(func)(123);
return 0;
}
void NAME(func)(int i)
{
printf("i is %d in %s.\n", i, __func__);
}
问题
这按预期工作,输出如下: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)
问题
如何为所有宏创建具有共同前缀的简单宏定义(名称 + 值)?目标是能够制作源文件的多个副本并使用不同的标志编译它们,这样所有版本都可以链接到同一个最终二进制文件中,而不会发生符号/宏名称冲突(宏稍后将被移动到头文件中)。最终文件太大而无法用 M4 或模板语言编写。理想情况下,解决方案将涉及能够为所有用例使用单个宏函数/可变参数宏,但我可以使用一个宏作为符号前缀,另一个宏作为宏名称前缀。