自动扣除类型与尺寸的类型在Visual Studio C 和GCC之间有所不同
auto deducted type from sizeof differs between Visual Studio C++ and GCC
我在这里有点迷路。
在我的代码中,我需要有一个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]:
sizeof
和sizeof...
的结果是std::size_t
类型的常数。
so, sizeof(buffer)
是标准的无符号整数类型。GCC中有一个错误(不太可能,因为std::size_t
是unsigned 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))
在分配之前将其转换。
- C2011 'CMemDC':Visual Studio 2019中的'class'类型重新定义
- Visual Studio Code "variable " u8 的 C/C++ 扩展名 " " 不是类型名称"
- Visual Studio 2019 - 设置文件类型的默认扩展名
- Visual Studio C++:不能使用类型为 "const wchar_t *" 的值来初始化类型为 "TCHAR *" 的实体
- C++ Visual Studio 重载函数错误:没有重载函数的实例与指定的类型匹配
- Visual Studio 2017 生成工具与枚举类型的问题
- 外部 "C" Visual Studio 2015 中的显式类型错误,DLL 测试代码
- 是否可以将Visual Studio 2017将C 代码编译到EXE以外的文件类型中
- Visual studio 2013 和 g++ 7.1 中将 int 和 long 类型相乘时的 c++ 差异行为
- 在Visual Studio中,C++构建配置类型是Debug,Debug3D,DebugDLL4,DebugDLL9,
- Visual Studio 2015 C2011 'Class' 类型重定义
- 模块计算机类型和目标计算机类型 Visual Studio 2013
- 作为模板非类型参数的 C 字符串在 gcc 6.3 中有效,但在 Visual Studio 2017(x64 为 19
- 将模板类型参数的映射存储到C++中的矢量中:Visual Studio
- 自动扣除类型与尺寸的类型在Visual Studio C 和GCC之间有所不同
- 如何在 Visual Studio 2015 中将项目的配置类型动态更改为静态库?
- 错误c++visual studio c2227左侧'->;Init';必须指向类/结构/联合/泛型类型
- 为什么我的Visual Studio 2017编译器无法识别C++17类型推导指南
- 误报警告PVS Studio:V808类型的对象是创建但未使用的
- C - Visual Studio-缺少类型的指定词 - 假设INT