为什么在Visual Studio 2010中将ssize_t定义为无符号?

德罗·哈拉里(Dor Harari)

我有一个可移植程序,在假定它是有符号整数的情况下使用ssize_t。从概念上讲,它会执行以下操作:

#include <stdint.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
    size_t size_10 = 10;
    size_t size_20 = 20;
    ssize_t len_diff;
    len_diff = (ssize_t)size_10 - (ssize_t)size_20;
    if (len_diff < 0)
        printf("negative\n");
    else if (len_diff > 0)
        printf("positive\n");
    else
        printf("zero\n");
}

人们会期望该程序打印“负”,但是却打印“正”。从ssize_t的定义方式很容易看出来(在sourceannotations.h中):

#ifndef _SSIZE_T_DEFINED
#ifdef  _WIN64
typedef unsigned __int64    ssize_t;
#else
typedef _W64 unsigned int   ssize_t;
#endif
#define _SSIZE_T_DEFINED
#endif

因此,减去两个无符号值将得到一个无符号值,并因此得到结果。

在Windows SDK的旧版本(例如V7.0A)中,ssize_t正确定义为:

//
// SIZE_T used for counts or ranges which need to span the range of
// of a pointer.  SSIZE_T is the signed variation.
//

typedef ULONG_PTR SIZE_T, *PSIZE_T;
typedef LONG_PTR SSIZE_T, *PSSIZE_T;

谁能解释这个变化?我们应该停止在Windows上使用ssize_t吗?

更新:根据所有答案,这似乎是Visual Studio 2010中的一个错误,其中包括ssize_t,但定义不正确。这是一个偷偷摸摸且令人讨厌的错误。

最后更新:此错误已在VS2012和VS2016中修复。从评论讨论中还可以看出,当比较的值在转换为SSIZE_T时具有不同的符号时,这种计算len_diff的方法是有问题的

汉斯·帕桑特

ssize_t标准的C,它是从Posix的一个typedef。您在VS2010的代码分析标头中找到它的原因可能与源有关,大多数代码分析工具始于Unix。在VS2012及更高版本中再次将其删除。

它完全存在于BaseTsd.h SDK文件肯定不是一个错误,Windows支持Posix子系统。这些typedef将操作系统与编译器实现细节隔离开来,这是Windows设法从16位变为32位到64位的体系结构变化中幸存下来的基本原因。

因此,真正的问题是您试图在Windows上编译Posix程序,但不使用Posix头文件。解决起来很简单,只需在#includes之前添加您自己的typedef。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在Visual Studio 2017中Python损坏了?

为什么我的代码无法在Visual Studio Code中运行?

为什么在Visual Studio 2015中无法编辑并继续工作?

为什么此reinterpret_cast在Visual Studio中失败?

为什么XmlSerializer在Visual Studio 2019中不会导致FileNotFoundException?

为什么在Visual Studio中我= i ++使其增加

为什么在 Unity 的建议中 Visual Studio 比 VS Code 更好?

为什么在Visual Studio 2015中找不到引用的组件在Visual Studio 2017中找不到

为什么Visual Studio将新创建的数组键入为Nullable?

为什么Visual Studio将UML用例图关联形状显示为箭头?这是对的吗?

为什么Visual Studio将新类的访问修饰符设置为Internal

为什么Visual Studio Code中的Python repl告诉我我的对象未定义?

为什么我的SSIS工具箱在Visual Studio 2019社区中为空?

为什么Visual Studio监视窗口在集合中为ValueTuples显示错误的值?

为什么Visual Studio将“ -1937169414”添加到生成的哈希码计算中?

为什么在Visual Studio 2019中无法将“ onpaste”识别为有效的javascript事件?

为什么Visual Studio Asp.net项目中的无点编译不起作用?

为什么Visual Studio 2010 Webform项目无法生成事件?

为什么会出现stackoverflow异常(EMGU,C#的openCV,Visual Studio 2010 Express)

当我在Visual Studio 2019中将项目发布到GitHub时,为什么progressBar会继续运行?

为什么在Visual Studio 2012中将“附加到进程”到w3wp.exe这么慢?

为什么在 Visual Studio 中将 dropDownMenu 添加到 Windows 窗体时出现错误?

指定extern“ C”时,为什么Visual Studio无法给出未定义的引用错误?

为什么Visual Studio告诉我未定义AddJsonFile()方法?

为什么在Visual Studio中使用LLVM + Clang时未定义__clang__?

为什么Visual Studio 2017无法为Swagger Petstore生成REST API客户端?

为什么在Visual Studio 2015 for SQL Server项目中单元测试显示为灰色?

为什么Visual Studio为C#6插值字符串创建双括号?

为什么 Visual Studio 为本地创建的新 git 分支显示“推送”而不是“发布”?