该__COUNTER__符号由VC++和GCC提供,并在每次使用时提供增加的非负积分值.
我有兴趣了解是否有人曾经使用它,以及它是否值得标准化?
我希望我的异常消息包含有关异常位置的信息.
所以我想有一些类似的东西.
#define LOCATION __FILE__ " : " __LINE__
throw std::exception(std::string("ABCD. ") + LOCATION);
Run Code Online (Sandbox Code Playgroud)
这个定义显然是不正确的.怎么做到这一点?
在:C++ FAQ - 其他技术问题 - [39.6]对于需要将两个令牌粘贴在一起的宏应该怎么做?
有人可以向我解释原因吗?我所读到的只是相信我,但我不能仅仅相信某事,因为有人这么说.
我尝试了这种方法,但我找不到任何错误:
#define mymacro(a) int a ## __LINE__
mymacro(prefix) = 5;
mymacro(__LINE__) = 5;
int test = prefix__LINE__*__LINE____LINE__; // fine
Run Code Online (Sandbox Code Playgroud)
那么为什么我需要这样做呢(引自网页):
但是,当您使用##时,需要双层间接.基本上你需要为"令牌粘贴"创建一个特殊的宏,例如:
Run Code Online (Sandbox Code Playgroud)#define NAME2(a,b) NAME2_HIDDEN(a,b) #define NAME2_HIDDEN(a,b) a ## b相信我 - 你真的需要这样做!(并且请没有人写信给我说它有时可以在没有第二层间接的情况下工作.尝试用__ LINE__连接一个符号然后看看会发生什么.)
编辑:有人也可以NAME2_HIDDEN在下面宣布之前解释他为什么使用?NAME2_HIDDEN在使用宏之前定义宏似乎更合乎逻辑.这是某种伎俩吗?