C++中__LINE__宏的类型是什么

bz4sfanl  于 2022-12-20  发布在  其他
关注(0)|答案(4)|浏览(242)

C++中__LINE__宏的类型是什么?

dauxcl2d

dauxcl2d1#

C++03 §16.8p1:
__LINE__当前源代码行的行号(十进制常量)。
这将是int,或者如果INT_MAX(允许最小为32,767)不够大(......我不会问......),那么它将是long int。如果它大于LONG_MAX,那么您就有了未定义的行为,这一次,在一个至少有2,147,483的文件中,这不是一个值得担心的问题,647行(LONG_MAX允许的最小值)。
同一部分还列出了您可能感兴趣的其他宏。

3pmvbmvn

3pmvbmvn2#

C标准简单地说:
__LINE__:当前源代码行的假定行号(在当前源文件中)(整型常量)。
它实际上并没有声明类型,所以它很可能是与源代码中的未修饰整数相同的类型,即int。允许范围的上限是2G - 1的事实支持这一点(即使下限是1)。
#line只允许数字(没有尾随的U使其无符号)这一事实也可以用来支持这一点。
但是,这仅仅是 * 支持。* 我在C
或C标准中都找不到一个明确的语句。它只是有意义的 *,当它通过预处理阶段时,它将被翻译成类似42的东西,这就是编译器将看到的,将它完全视为42(一个int)。

  • a:虽然这不是我第一次判断错误:-)
apeeds0o

apeeds0o3#

有关常规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__);
}
cngwdvgl

cngwdvgl4#

C11,脚注177:
假定的源文件名和行号可以通过#line指令进行更改。
注:ISO/IEC Directives, Part 2
文档正文的脚注用于为正文中的特定项目给予附加的上下文信息。文档应在没有脚注的情况下使用。
C11,6.10.4线路控制:
# line digit-sequence new-line
数字序列不得指定零,也不得指定大于2147483647的数字。
C11,5.2.4.2.1整数类型的大小<limits.h>:
它们的实现定义值的大小(绝对值)应等于或大于所示值,符号相同。
long int类型对象的最大值
LONG_MAX +2147483647 // 2^31 − 1
因此,我得出结论,__LINE__保证适合long int

相关问题