sizeof的自动扣除类型在Visual Studio C ++和GCC之间有所不同

问题描述 投票:0回答:2

我在这里有点失落。

在我的代码中,我需要有一个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。

但为什么?我该怎么做才能防止这种情况发生?我认为有标准要坚持...... :(

c++ sizeof auto
2个回答
2
投票

根据§18.2p6[support.types]:

类型size_t是一个实现定义的无符号整数类型,其大小足以包含任何对象的字节大小。

§5.3.3p6[expr.sizeof]:

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

因此,sizeof(buffer)是标准的无符号整数类型。 GCC中有一个错误(这不太可能,如std::size_t is unsigned long)或您的错误不是您认为的错误。


0
投票

解释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))进行转换。

© www.soinside.com 2019 - 2024. All rights reserved.