gpt4 book ai didi

c - 为什么 Visual Studio 2010 中的 ssize_t 被定义为无符号?

转载 作者:可可西里 更新时间:2023-11-01 12:36:15 24 4
gpt4 key购买 nike

我有一个使用 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 的方法似乎是有问题的

最佳答案

这是一个好的解决方案吗?

#if defined(_MSC_VER)
#include <BaseTsd.h>
typedef SSIZE_T ssize_t;
#endif

关于c - 为什么 Visual Studio 2010 中的 ssize_t 被定义为无符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22265610/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com