我在这里有点失落。
在我的代码中,我需要有一个unsigned int
作为SAP Netweaver调用Rfc函数的参考,这是我给函数提供的缓冲区的大小。
在我的VS环境中,我编程:
auto buffer_length = sizeof(buffer);
auto rc = RfcCall...(..., &buffer_length, ...)
这编译好并悬停在它显示的`buffer_length'上,它确实是一个unsigned int。
使用GCC 4.8.5编译的完全相同的代码会抛出编译器错误 - 结果是我的变量类型为int。
但为什么?我该怎么做才能防止这种情况发生?我认为有标准要坚持...... :(
根据§18.2p6[support.types]:
类型
size_t
是一个实现定义的无符号整数类型,其大小足以包含任何对象的字节大小。
§5.3.3p6[expr.sizeof]:
sizeof
和sizeof...
的结果是std::size_t
类型的常数。
因此,sizeof(buffer)
是标准的无符号整数类型。 GCC中有一个错误(这不太可能,如std::size_t
is unsigned long
)或您的错误不是您认为的错误。
解释ISO标准,cppreference给出:
sizeof()返回std :: size_t的值,该值由标准定义为
typedef /*implementation-defined*/ size_t;
你唯一的保证是
std :: size_t可以存储任何类型(包括数组)理论上可能的对象的最大大小。
这至少保留了C ++ 11,ISO C ++将std :: size_t的定义推迟到ISO C,后者又将其推迟到编译器。我有Visual Studio 2015,所以它存在于vcruntime.h中,其定义是
#ifdef _WIN64
typedef unsigned __int64 size_t;
...
#else
typedef unsigned int size_t;
C ++ 11添加了固定宽度的整数类型,例如std::uint64_t
,它保证是64位无符号整数。然后,您可以在分配之前使用static_cast<std::uint64_t>(sizeof(buffer))
进行转换。