C++ 大小和大小不一致
如果不包含头文件就无法定义本机运算符的结果,这不是很麻烦吗 据此,C++ 大小和大小不一致,c++,sizeof,C++,Sizeof,如果不包含头文件就无法定义本机运算符的结果,这不是很麻烦吗 据此,size\u t在头文件cstddef、cstdio、cstring、ctime和cstdlib中定义。因此,如果这两个标题都不包括,那么size\t应该是未定义的。但是,以下程序编译时没有任何警告(使用MSVC 2015RC) 似乎size\u t在某种程度上介于原生类型和typedef之间。标准怎么说?5.3.3尺寸[expr.Sizeof] 1) sizeof运算符生成对象中的字节数 其操作数的表示形式。操作数可以是表达式,
size\u t
在头文件cstddef、cstdio、cstring、ctime和cstdlib中定义。因此,如果这两个标题都不包括,那么size\t
应该是未定义的。但是,以下程序编译时没有任何警告(使用MSVC 2015RC)
似乎
size\u t
在某种程度上介于原生类型和typedef之间。标准怎么说?5.3.3尺寸[expr.Sizeof]
1) sizeof运算符生成对象中的字节数
其操作数的表示形式。操作数可以是表达式,
哪一个是未赋值的操作数(第5条)或带括号的操作数
type-id。sizeof运算符不得应用于表达式
具有函数或不完整类型的,以括号中的名称
这类类型,或指定位字段的glvalue。sizeof(char),
sizeof(有符号字符)和sizeof(无符号字符)为1。结果
适用于任何其他基本类型(3.9.1)的sizeof为
实现定义。[注:特别是sizeof(bool),
sizeof(char16_t)、sizeof(char32_t)和sizeof(wchar_t)是
实施-1.75-结束注释][注:见1.7了解
字节定义和3.9对象定义
陈述-结束语]
6) sizeof和sizeof的结果。。。是std::size\u t类型的常量。
[注:标准标题
(18.2)。-结束注释]
但是,std::size\t
只是一个类型别名。sizeof
运算符可以返回其结果,而无需“访问”类型别名;sizeof
的结果是一些基本类型(实现定义),然后在
中别名为std::size\t
注意,在C++ +<代码> Type Fux< /Calp>或
只是推断出由auto
运算符返回的基本类型,它与类型别名sizeof
相同。编译器没有问题。std::size\t
sizeof
和sizeof…
的结果是std::size\u t类型的常量。
[注:std::size\u t
在
标准标题
(18.2)。-结束注释]
好问题。实际上,如果用size\u t替换auto,它在VC++中编译得很好,但gcc会给出一个错误,这实际上取决于编译器的实现。有些编译器允许使用
size\t
而不包含任何头文件,而有些编译器不允许,但它们不应该包含头文件!在当前代码中,一切都很清楚-sizeof返回std::size_t的类型,但std::size_t只是unsigned int的同义词,因此它实际上返回unsigned int,而auto在本例中只是unsigned int。@DmitriSosnikcstdef
与编译器无关。编译器独立于标头。构建时,决定在X平台上,sizeof
的结果将是例如unsigned long int
。然后,它附带的一致性标准库将size\u t
定义为unsigned long int
。只要您想确保您的类型“大”到足以存储基本上任何可能的可表示大小,就需要size\u t
。否则,一些代码将使用无符号int
,另一些代码将使用无符号long
,移植它们将是一团混乱。@DmitriSosnik是的,我同意,客户不应该关心size\u t
的基本类型,如果这是您的意思的话。只需透明地使用它。使用nullptr
更有趣;至少size\t
是某些无符号整数类型的别名,您可以用另一种方式编写+顺便说一句,@T.C.不得不说我仍然不能完全理解nullptr
。我将花一次时间阅读标准。
int main()
{
auto d_Size = sizeof( int );
return 0;
}