将参数与预定义标记连接起来

Concatenating an argument with a predefined token

本文关键字:连接 起来 预定义 参数      更新时间:2023-10-16

我正在定义一个宏,其中我将一个标记作为参数,并将其附加到前缀,如下所示:

Enum::Type var = FULL_NAME(enum1);

应该翻译成:

Enum::Type var = Enum::Type::enum1;

我知道你可以使用##操作符连接两个参数,像这样:

#define glue(a, b) (a ## b)

但是我可以像

那样使用它吗?
#define FULL_NAME(name) (Enum::Type ## name)

?

如果不是,正确的方法是什么?

不,##用于创建令牌。你不需要那个,它不会工作的。

你想要的要简单得多:

#define FULL_NAME(name) (Enum::Type::name)

虽然您可能认为Enum::Type::enum1是一个名称,但它实际上是五个令牌。您可以在标记之间使用空白或甚至注释来编写它,尽管我不建议这样做,除非作为学习练习:

 Enum   ::/* the outer namespace */
    Type  // the inner namespace
        :: enum1