_LINE__在内联函数中的行为

时间:2012-06-26 19:03:33

标签: c++ c line inline c-preprocessor

我有一个宏,它将行号和文件名传递给错误处理程序:

#define SYSTEM_FAILURE (error_code, comment) \
   System_Failure((error_code), (comment), __LINE__, __FILE__);

在内联函数中使用时,如何解析__LINE__

file.h:
inline int divide(int x, int y)
{
    if (y == 0)
    {
        SYSTEM_FAILURE(ENUM_DIVIDE_BY_ZERO, "divide by zero error");
    }
    return x/y;
}

__LINE__包含头文件中的行号,或者调用内联函数的源文件的行号(假设编译器在源代码中执行“粘贴”)?

3 个答案:

答案 0 :(得分:21)

在C和C ++中,宏(大多数情况下)不是用实际代码的任何知识进行评估,而是在代码之前处理(因此称为“预处理器”)。因此,__FILE__将评估为“file.h”,而__LINE__将评估与file.h中SYSTEM_FAILURE出现的行对应的行号。

答案 1 :(得分:6)

由于宏在编译之前被其定义替换,__LINE__将包含您在其中使用宏的文件的实际行。内联不会影响这种行为。

答案 2 :(得分:4)

__LINE__将成为头文件的一行,因为预编译器会在编译器看到它之前对其进行评估。