自动扣除类型与尺寸的类型在Visual Studio C 和GCC之间有所不同

auto deducted type from sizeof differs between Visual Studio C++ and GCC

本文关键字:类型 Studio Visual 之间 GCC 有所不同      更新时间:2023-10-16

我在这里有点迷路。

在我的代码中,我需要有一个unsigned int作为SAP NetWeaver呼叫RFC函数的参考,该函数的大小是我给该功能的缓冲区的大小。

在我的VS环境中,我对此进行编程:

auto buffer_length = sizeof(buffer);
auto rc = RfcCall...(..., &buffer_length, ...)

这表明这确实是一个无符号的int。

用GCC 4.8.5编译的完全相同的代码抛出编译器错误 - 事实证明,我的变量是int type int。

但是为什么?我该怎么做才能防止这种情况?我认为有标准可以遵守... :(

根据§18.2p6[support.types]:

类型size_t是一种实现定义的未签名整数类型,足够大,可以包含任何对象的字节中的大小。

和§5.3.3p6[expr.sizeof]:

sizeofsizeof...的结果是std::size_t类型的常数。

so, sizeof(buffer)是标准的无符号整数类型。GCC中有一个错误(不太可能,因为std::size_tunsigned long),或者您的错误不是您认为它的位置。

释义ISO标准,cppReference给出:

sizeof()返回std :: size_t的值,该值按标准为

定义

typedef /*implementation-defined*/ size_t;

唯一保证是

std :: size_t可以存储任何类型的理论上可能对象的最大大小(包括数组)。

这至少可容纳C 11,ISO C 为ISO C的std :: size_t的定义定义,从而将其辩护给编译器。我有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))在分配之前将其转换。

相关文章: