Pourquoi ssize_t dans Visual Studio 2010 est défini comme non signé?

J'ai un programme portable qui utilise ssize_t en vertu de l'hypothèse qu'il est un entier signé. Sur le plan conceptuel, il fait quelque chose comme:

#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");
}

On pourrait croire que le programme d'impression "négatif", mais au lieu de l'impression "positive". La raison en est facile de voir à partir de combien de ssize_t est défini (dans 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

Et donc, de la soustraction de deux valeurs non signées résultats dans un unsigned de la valeur et donc le résultat.

Dans les anciennes versions du SDK de Windows (par exemple V7.0A) le ssize_t a été correctement définie comme:

//
//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;

Quelqu'un peut expliquer ce changement? Sommes-nous censés cesser d'utiliser ssize_t sur Windows?

Mise à jour:
Basé sur toutes les réponses, il semble être un bogue dans Visual Studio 2010 qui comprend ssize_t mais pas correctement défini. C'est un sournois et méchant bug.

Dernière Mise À Jour:
Ce bogue a été corrigé dans VS2012 et VS2016. Également dans le commentaire la discussion, il apparaît que cette méthode de calcul de la len_diff est problématique lorsque les valeurs comparées sont de signes différents lors coulé à SSIZE_T

C'est un bug dans V7.0A. Selon msdn.microsoft.com/en-us/library/windows/desktop/... signé size_t est LONG_PTR.
Ainsi, le "ou". 🙂
assez. C'est vraiment assez fou qu'ils ont défini le connecté version de size_t non signés.
Il me semble que le tout-caps, MS-style SSIZE_T est correct et c'est juste la POSIX-style ssize_t c'est cassé, donc je suppose que c'est encore un autre subtile de tenter de casser le portable de la croix-code plate-forme et de la force spécifique à Windows #ifdefs...
Mentionnés ssize_t buggy définition n'est pas présent dans VC2012

OriginalL'auteur Dror Harari | 2014-03-08

Leave a Reply

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *