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

How to merge symbol name and symbol value in C preprocessor

本文关键字:符号 合并 预处理 处理器      更新时间:2023-10-16

这个想法是创建自动投射器,它会根据给定的前缀和数字粘贴指向变量的指针。假设您有一些不断开发的界面,因此您每隔几周就会获得一些新的结构版本。因此,与其写显式"(结构1*),(结构2*)"等,不如使用SOME_DEFINE(thisStructure,版本);这将处理此案

我以为这样可以解决问题

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

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

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

#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.

#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++变量或其值一无所知。