2013-06-21 28 views
-4

我有一个宏观宣布为:在使用__FILE__和__LINE__一个用户定义的宏

#define Ex(a) { throw MyException((a), __LINE__, __FILE__); } 

而且我使用它是这样的:

if (bad_things_happen) Ex(error_code) 

将这些宏包含行以及#define声明文件或if声明?如果它们所包含的#define语句的行和文件,然后我的宏是基本上是无用的...

+6

为什么你不测试它并找出 – aaronman

回答

1

不,它扩展到你使用它的行号:

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

至于文件:

__FILE__此宏扩展到当前输入文件的名称,在C字符串常量的形式。这是预处理程序打开文件的路径,而不是在'#include'中指定的短名称或输入文件名称参数。例如,“/usr/local/include/myheader.h”是这个宏的一个可能的扩展。

+0

......但在这种情况下,“你使用它的地方”是什么意思? – creXALBO

+1

@creXALBO它会展开到当前行,而不是宏定义的位置。宏只是文本替换。 – 0x499602D2

+1

creXALBO的问题是相当有效的......一个宏只是文本替换实际上没有帮助解释,因为正如文字所说,“__LINE__”是一个“非常奇怪”的宏,*不是*简单的文本替换,因为它的价值变化。您应该澄清您的答案,以指定“__LINE__”具有展开的源代码行的值,而不是文本出现的位置。 (您上面的评论不是答案的一部分。) –

相关问题