C++ C++;__行__宏的类型是什么

C++ C++;__行__宏的类型是什么,c++,visual-c++,macros,logic,C++,Visual C++,Macros,Logic,正如你们从我的其他问题中看到的,你们中的许多人可能已经得到了这个问题的答案。你能把这个知识分享给我吗?< /P> < P> C++的标准只是这样说: \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 它实际上没有声明类型,因此它很可能与源代码中的未加修饰的整数类型相同,即int。允许范围的上限为2G-1这一事实支持这一点(即使下限为1) #line只允许数字(没有尾随的U

正如你们从我的其他问题中看到的,你们中的许多人可能已经得到了这个问题的答案。你能把这个知识分享给我吗?< /P> < P> C++的标准只是这样说:

\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

它实际上没有声明类型,因此它很可能与源代码中的未加修饰的整数类型相同,即
int
。允许范围的上限为
2G-1
这一事实支持这一点(即使下限为
1

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

但是,这只是支持。在C++或C标准中,我找不到一个明确的声明。当它经过预处理阶段时,它将被翻译成类似于
42
的东西,这就是编译器将看到的,将它完全像
42
(一个
int
)一样处理


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

C++03§16.8p1:

__行\当前源行的行号(十进制常数)

这将是int,或者如果int_MAX(允许最小为32767)不够大(…我不会问…),那么它将是long int。如果它将大于long_MAX,那么您就有未定义的行为,这一次,对于一个至少有2147483647行的文件来说,不值得担心(LONG_MAX的最小允许值)

同一节还列出了您可能感兴趣的其他宏。对于一般C++代码,

< P>,请参阅./P> 在Visual Studio 2017中(我怀疑,还有所有其他版本)
\uuuuuu LINE\uuuu
的类型为
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__);
}
#包括
#包括
模板
无效打印类型(T x)
{

std::cout是一个预处理器数值常量。@aaa我想知道它的类型是显式的,比如int,int*,等等。它没有显式的类型,因为它是预处理器常量。每次出现uline uu都会在编译之前变为实际值,所以在有类型之前。@Pawel常量有类型。你还没有放弃滥用opera吗tor@prabhakaran:链接到什么?标准还是草稿?@prabhakaran:
HRESULT
是一个typedef,而不是一个独立的类型。特别是,它是一个数字类型的typedef。您可以将37转换为HRESULT。现在,37也可能发生,因为您在第37行有一个
\uu LINE\uu
宏。正如您所说的行宏的类型是i但是,由于我有一个重载函数,它花费了它的参数很长的时间,我的int接收重载函数不能得到任何机会。我忘记了运算符重载参数匹配的顺序。现在我更正了函数。谢谢你的帮助reply@MSalters是的,你完全正确,谢谢你的更正NathanOsman:你还需要一个,才能得到2147483648。然而,我更担心的是#行指令滥用,但更多!=非常严重。十进制常量类型的最终声明在C++03§2.13.1p2中,这里表示int或long int。是的,但它不一定是十进制常量,这就是为什么我我不愿发表声明。在我看来,一致性实现可以将
\uuu LINE\uuuu
转换为
42U
,并且仍然是犹太教的。我手头没有C++03,但有C++0x,我从状态“整型常量”中获取我的东西,其中包括U、L、UL、LL和ULL类型。C++03确切地说是“十进制常量”@史提夫:别忘了C++是C++的规范引用。但是我不知道你所说的是如何改变的,但它不一定是十进制常量“= >”C++ 03确切地说“十进制常量”。@弗莱德:对于C++中的C++语言来说,它是规范的,C++中的任何一个定义都是C++的。在C++ 03中,C++是一个十进制常量,我只是指出C++只是非常临时定义的。“十进制常数”,在一个评论中,表示了与C比较的意图。我认为他们根本不打算用C++中的“十进制常量”这个短语,但是他们确实这么做了,所以我们必须推断出我们可以一起拼凑的任何意义。