这是__LINE__的正确行为吗?

时间:2011-05-06 06:07:19

标签: c-preprocessor

15 ERROR_MACRO("Error is in %s on line %d\n",
16                __FILE__, __LINE__);

我得到以下输出:

  

第16行的tmp.c中出现错误

即使我以这种形式使用上述行,我也得到相同的输出:

15 ERROR_MACRO("Error is in %s on line %d\n", \
16                __FILE__, __LINE__);

我不应该得到“第15行”而不是“第16行”吗?

我该怎么做才能得到“第15行”?

3 个答案:

答案 0 :(得分:2)

__LINE__始终展开到其显示的确切行号。这取决于编译器如何报告跨越多行的代码的错误,但是大多数编译器都遵循语句开始的行(因为大多数错误不能本地化为单个字符)。

没有宏可以确定当前语句出现在哪一行,因为预处理通常在编译器开始考虑语句之前发生。

答案 1 :(得分:0)

将ERROR_MACRO移至代码中的第15行? __LINE__是当前文件中的行号。除非你移动你的代码,否则没有(合法的)方法来改变它......

答案 2 :(得分:0)

如果您坚持在通话后的线路上使用__LINE__,那么只需执行以下操作:

    ERROR_MACRO("Err in %s on line %d\n",
                __FILE__, __LINE__ - 1);

更好的是,为什么不为宏定义一个宏:

    #define MY_ERR ERROR_MACRO("Err in %s on line %d", __FILE__, __LINE__)

现在你可以调用一个简短的MY_ERR;而不是担心行长限制(这就是为什么你这样做,我猜)。