变量名中的__COUNTER__

时间:2012-10-02 12:52:49

标签: c++ macros clang c-preprocessor

我见过这个问题:

How to generate random variable names in C++ using macros?

以下答案:https://stackoverflow.com/a/1675203/551045

我试图在clang中实现它。

这是我的声明:

#define TRACE(stream) FuncTrace x#__COUNTER__ (llvm::errs(), "hallo", 1)

我尝试了所有版本x##__COUNTER__; x ## __COUNTER__等等,但似乎都没有。

这可能是一个铿锵的bug吗? clang help页面显示它有__COUNTER__宏。

最后我需要这样的宏:

#define TRACE(stream) FuncTrace x#__COUNTER__ (stream, __FUNCTION__, __LINE__)

1 个答案:

答案 0 :(得分:7)

  1. 要将两个令牌连接成一个,请使用##运算符。 #运算符用于将标记转换为字符串。

  2. x ## __COUNTER__只会生成x__COUNTER__。您需要先完全展开__COUNTER__。一种可能的方法是增加一些间接,例如

    #define YTRACE(x, y) FuncTrace x##y (llvm::errs(), __FUNCTION__, __LINE__)
    #define XTRACE(x, y) YTRACE(x, y)
    #define TRACE(x) XTRACE(x, __COUNTER__)