在宏定义

时间:2016-01-29 15:11:48

标签: c++ macros c-preprocessor

在宏中,我想生成一个具有不同名称的变量,并尝试使用__LINE__作为区分它们的方法。简化示例:

#define UNIQUE_INT   int prefix##__LINE__

UNIQUE_INT;
UNIQUE_INT;

但似乎__LINE__没有扩展,因为我在第二个中获得了“int prefix__LINE__':redefinition”。

我认为__LINE__不能在宏定义中使用,就好像它扩展了#definition的行号而不是宏的调用行,但让我问一下有人有话要说。

1 个答案:

答案 0 :(得分:7)

问题在于,在预处理器中,##发生在扩展__LINE__之前。如果添加另一层间接,则可以获得所需的结果。

由于技术原因,你实际上需要两个宏(有时如果你在现有的宏中使用它,你不需要第二个,看来......):

#define TOKEN_PASTE(x, y) x##y
#define CAT(x,y) TOKEN_PASTE(x,y)
#define UNIQUE_INT \
  int CAT(prefix, __LINE__)

UNIQUE_INT;
UNIQUE_INT;