0

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

我认为这可以解决问题

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

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

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

4

2 回答 2

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这是有效的,因为will 之前发生的参数的完整宏扩展PASTEHELPER被扩展,所以在PASTE(A,x), 上面,参数PASTEHELPERwillA123

于 2012-11-16T08:55:33.360 回答
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++ 变量或其值一无所知。

于 2012-11-16T09:00:09.497 回答