请问size_t是什么类型?

时间:2022-03-31 17:01:17
以下代码

map<int,char> x;
cout<<x.size()<<endl;

(vc2003)warning C4267: “参数” : 从“size_t”转换到“unsigned int”,可能丢失数据

查MSDN得:
size_t unsigned integer     Result of sizeof operator.  STDDEF.H and other include files 


请问是怎么回事?

11 个解决方案

#1


size_t
有时就是unsigned int;
有时就是unsigned long;
在你写的代码里就是unsigned long;

#2


请问这个有时是怎么判断?
我如何可以避免这个warning?

#3


把unsigned int的地方换成size_t

#4


这是因为测试 32 位代码的 64 位兼容性问题而出现的警告,由 /WP64 开关控制,默认是打开的。

在上面的程序中实际上不存在任何兼容性问题(也就是说在这里出现warning是不应该的,是编译器的一个败笔),你可放心地把 /WP64 开关关闭以避免这个warning。

#5


很多情况下是:
typedef unsigned long size_t;

#6


感谢楼上的。

#7


size_t是针对系统定制的一种数据类型,一般是整形,因为C/C++标准只定义一最低的位数,
而不是必需的固定位数。而且在内存里,对数的高位对齐存储还是低位对齐存储各系统都不一样。为了提高代码的可移植性,就有必要定议这样的数据类型。一般这种类型都会定义到它具体占几位内存等。当然,有些是编译器或系统已经给定义好的。具体要查看技手册。

#8


设计 size_t 就是为了适应多个 平台的 需要 ...

#9


但是我看MSDN上好像是说size_t是微软自己的定义

The Microsoft run-time library defines the following standard types.
.....
.....
size_t unsigned integer   Result of sizeof operator.  STDDEF.H and other include files 
.....

#10


#ifndef _SIZE_T_DEFINED
#ifdef  _WIN64
typedef unsigned __int64    size_t;
#else
typedef _W64 unsigned int   size_t;
#endif
#define _SIZE_T_DEFINED
#endif

STDDEF.H的内容,是不是不同的编译器里不一样呢?

#11


是的。而且你还可以自己重新定义的!

#1


size_t
有时就是unsigned int;
有时就是unsigned long;
在你写的代码里就是unsigned long;

#2


请问这个有时是怎么判断?
我如何可以避免这个warning?

#3


把unsigned int的地方换成size_t

#4


这是因为测试 32 位代码的 64 位兼容性问题而出现的警告,由 /WP64 开关控制,默认是打开的。

在上面的程序中实际上不存在任何兼容性问题(也就是说在这里出现warning是不应该的,是编译器的一个败笔),你可放心地把 /WP64 开关关闭以避免这个warning。

#5


很多情况下是:
typedef unsigned long size_t;

#6


感谢楼上的。

#7


size_t是针对系统定制的一种数据类型,一般是整形,因为C/C++标准只定义一最低的位数,
而不是必需的固定位数。而且在内存里,对数的高位对齐存储还是低位对齐存储各系统都不一样。为了提高代码的可移植性,就有必要定议这样的数据类型。一般这种类型都会定义到它具体占几位内存等。当然,有些是编译器或系统已经给定义好的。具体要查看技手册。

#8


设计 size_t 就是为了适应多个 平台的 需要 ...

#9


但是我看MSDN上好像是说size_t是微软自己的定义

The Microsoft run-time library defines the following standard types.
.....
.....
size_t unsigned integer   Result of sizeof operator.  STDDEF.H and other include files 
.....

#10


#ifndef _SIZE_T_DEFINED
#ifdef  _WIN64
typedef unsigned __int64    size_t;
#else
typedef _W64 unsigned int   size_t;
#endif
#define _SIZE_T_DEFINED
#endif

STDDEF.H的内容,是不是不同的编译器里不一样呢?

#11


是的。而且你还可以自己重新定义的!