内联函数中__LINE__的行为

Behavior of __LINE__ in inline functions

本文关键字:LINE 函数      更新时间:2023-10-16

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

#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__是否在头文件中包含行号,或者调用内联函数的源文件的行号(假设编译器在源代码中"粘贴")?

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

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

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