C++ 在用户定义的宏中使用文件和行

C++ 在用户定义的宏中使用文件和行,c++,exception,macros,C++,Exception,Macros,我将宏声明为: #define Ex(a) { throw MyException((a), __LINE__, __FILE__); } 我是这样使用它的: if (bad_things_happen) Ex(error_code) 这些宏将包含#define语句的行和文件,还是if语句?如果它们包含#define语句的行和文件,则我的宏基本上是无用的…否,它会扩展到使用它的行号: \uuuu LINE\uuuu此宏以十进制整数常量的形式扩展到当前输入行号。虽然我们称它为预定义宏,但它是一

我将宏声明为:

#define Ex(a) { throw MyException((a), __LINE__, __FILE__); }
我是这样使用它的:

if (bad_things_happen) Ex(error_code)

这些宏将包含
#define
语句的行和文件,还是
if
语句?如果它们包含
#define
语句的行和文件,则我的宏基本上是无用的…

否,它会扩展到使用它的行号:

\uuuu LINE\uuuu
此宏以十进制整数常量的形式扩展到当前输入行号。虽然我们称它为预定义宏,但它是一个非常奇怪的宏,因为它的“定义”随着每一行源代码的变化而变化

至于档案:

\uuuu FILE\uuuu
此宏以C字符串常量的形式扩展为当前输入文件的名称。这是预处理器打开文件的路径,而不是“#include”中指定的短名称或作为输入文件名参数。例如,“/usr/local/include/myheader.h”可能是此宏的扩展


你为什么不测试一下,看看。。。但在这种情况下,“在哪里使用它”是什么意思?@creXALBO它将扩展到当前行,而不是宏定义的位置。宏只是文本替换。creXALBO的问题很有道理。。。宏是简单的文本替换实际上无助于解释,因为正如文本所说,
\uuuu LINE\uuuu
是一个“非常奇怪”的宏,它不是简单的文本替换,因为它的值发生了变化。您应该澄清您的答案,以指定
\uuuuuuuuuu\uuuuuu
具有源代码行的值,而不是它在文本中出现的位置。(你上面的评论不是答案的一部分。)