我见过这个问题:
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__)
答案 0 :(得分:7)
要将两个令牌连接成一个,请使用##
运算符。 #
运算符用于将标记转换为字符串。
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__)