【问题标题】:Behavior of __LINE__ in inline functions内联函数中 __LINE__ 的行为
【发布时间】:2012-06-26 19:03:33
【问题描述】:

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

#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、内联函数和宏。
  • @Thomas,在您自己的编译器上对此进行测试并将结果包含在您的问题中(从而使其更像my preprocessor does this, is it standard?)将会(并且仍然可以)中性许多反对票。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 他说的是C++函数是inline,而不是宏。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-05
      • 1970-01-01
      • 2017-10-26
      • 1970-01-01
      相关资源
      最近更新 更多