C++中__LINE__宏的类型是什么?
__LINE__
dauxcl2d1#
C++03 §16.8p1:__LINE__当前源代码行的行号(十进制常量)。这将是int,或者如果INT_MAX(允许最小为32,767)不够大(......我不会问......),那么它将是long int。如果它大于LONG_MAX,那么您就有了未定义的行为,这一次,在一个至少有2,147,483的文件中,这不是一个值得担心的问题,647行(LONG_MAX允许的最小值)。同一部分还列出了您可能感兴趣的其他宏。
3pmvbmvn2#
C标准简单地说:__LINE__:当前源代码行的假定行号(在当前源文件中)(整型常量)。它实际上并没有声明类型,所以它很可能是与源代码中的未修饰整数相同的类型,即int。允许范围的上限是2G - 1的事实支持这一点(即使下限是1)。#line只允许数字(没有尾随的U使其无符号)这一事实也可以用来支持这一点。但是,这仅仅是 * 支持。* 我在C或C标准中都找不到一个明确的语句。它只是有意义的 *,当它通过预处理阶段时,它将被翻译成类似42的东西,这就是编译器将看到的,将它完全视为42(一个int)。
int
2G - 1
1
#line
U
42
apeeds0o3#
有关常规C++代码,请参见the other answer。在Visual Studio 2017中(我怀疑所有其他版本也是如此),__LINE__的类型为long。我使用下面的代码来发现它:
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__); }
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。
# line digit-sequence new-line
long int
LONG_MAX +2147483647 // 2^31 − 1
4条答案
按热度按时间dauxcl2d1#
C++03 §16.8p1:
__LINE__当前源代码行的行号(十进制常量)。
这将是int,或者如果INT_MAX(允许最小为32,767)不够大(......我不会问......),那么它将是long int。如果它大于LONG_MAX,那么您就有了未定义的行为,这一次,在一个至少有2,147,483的文件中,这不是一个值得担心的问题,647行(LONG_MAX允许的最小值)。
同一部分还列出了您可能感兴趣的其他宏。
3pmvbmvn2#
C标准简单地说:
__LINE__
:当前源代码行的假定行号(在当前源文件中)(整型常量)。它实际上并没有声明类型,所以它很可能是与源代码中的未修饰整数相同的类型,即
int
。允许范围的上限是2G - 1
的事实支持这一点(即使下限是1
)。#line
只允许数字(没有尾随的U
使其无符号)这一事实也可以用来支持这一点。但是,这仅仅是 * 支持。* 我在C或C标准中都找不到一个明确的语句。它只是有意义的 *,当它通过预处理阶段时,它将被翻译成类似
42
的东西,这就是编译器将看到的,将它完全视为42
(一个int
)。apeeds0o3#
有关常规C++代码,请参见the other answer。
在Visual Studio 2017中(我怀疑所有其他版本也是如此),
__LINE__
的类型为long
。我使用下面的代码来发现它:
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
。