C ++ __LINE__宏的类型是什么

时间:2011-02-22 08:52:35

标签: c++ visual-c++ macros logic

正如您可能从我的其他问题中看到的,许多人可能已经得到了答案。你能把这些知识分享给我吗?

3 个答案:

答案 0 :(得分:21)

C ++03§16.8p1:

  

__ LINE__当前源行的行号(十进制常量)。

这将是int,或者如果INT_MAX(允许小到32,767)不够大(......我不会问......),那么它将是long int。如果它大于LONG_MAX,那么你有一个未定义的行为,这个问题在一个至少2,147,483,647行(LONG_MAX的最小允许值)的文件中不值得担心。

同一部分还列出了您可能感兴趣的其他宏。

答案 1 :(得分:5)

C ++标准简单地说:

  

__LINE__:当前源行的假定行号(在当前源文件中)(整数常量)。

它实际上并没有说明类型,所以它很可能与你的源代码中的未加修整的整数相同,这将是int。允许范围的上端为2G - 1的事实支持这一点(即使较低范围为1)。

#line只允许数字(没有尾随U使其无符号)的事实也可以被阅读以支持这一点。

但是,这只是支持。我无法在C ++或C标准中找到明确的声明。它只是有意义 * a 它会在经过预处理阶段时被翻译成类似42的东西,这就是编译器将看到的内容,完全像42一样对待它(int)。


* a :这不是我的常识第一次出错: - )

答案 2 :(得分:1)

有关一般 C++ 代码,请参阅 the other answer

在 Visual Studio 2017(以及我怀疑所有其他版本)中,__LINE__ 的类型为 long

我使用以下代码来发现它:

#include <iostream>
#include <typeinfo>

template <typename T>
void print_type(T x)
{
    std::cout << x << " has type " << typeid(x).name();
}

int main()
{
    print_type(__LINE__);
}