如何在C预处理器中合并符号名称和符号值

时间:2012-11-16 08:48:46

标签: c++ c casting c-preprocessor

这个想法是创建自动施法者,它会根据给定的前缀和数字粘贴指向变量的指针。 假设你有一些不断开发的界面,所以你每隔几周就会获得一些新的结构版本。因此,您可以只使用SOME_DEFINE(thisStructure,version),而不是编写明确的“(structure1 *),(structure2 *)”等等;这将处理案件

我认为这可以解决问题

#define d1(x) x
#define d2(x,y) x##y

void someFunction()
{
    int temp = 3;
    d2(myStructure,d1(temp)) *thisStruct;
}

我希望预处理器能够嵌套自己并首先粘贴d1操作,然后将d1操作的结果与第一个d2参数合并。然而它不起作用,所以我的问题是,我怎么能实现这个原因似乎是可能的。

2 个答案:

答案 0 :(得分:5)

我不确定你要做什么,但通常的问题 这是预处理器进行令牌粘贴和字符串化 在它的参数中进行宏替换之前。所以,如果你写 类似的东西:

#define PASTE(a,b) a ## b

并称之为:

#define x 123
PASTE(A,x)

,最后一行扩展为Ax,而不是A123。获得所需 结果,通常需要添加一个间接级别:

#define PASTEHELPER(a,b) a ## b
#define PASTE(a,b) PASTEHELPER(a,b)

这是有效的,因为PASTE的参数的完全宏扩展将会 在PASTEHELPER展开之前发生,所以在PASTE(A,x),上面, PASTEHELPER的参数将为A123

答案 1 :(得分:2)

#define d2(x,y) x ## y

void someFunction()
{
    int temp = 3;
    d2(myStructure,temp) *thisStruct;
}

预处理器将其转换为:

void someFunction()
{
    int temp = 3;
    myStructuretemp *thisStruct;
}

如果你想要替换那里的'3',那么你得到myStructure3,那么你不能用预处理器做到这一点 - 它对C / C ++变量或它们的值一无所知。