web-dev-qa-db-fra.com

'% d' attend un argument de type 'int', mais l'argument 2 a le type 'long unsigned int' [-Wformat =]

Je reçois toujours des avertissements de compilation mais je ne sais pas comment y remédier:

'%d' expects argument of type 'int', but argument 2 has type 'long unsigned int' [

Le programme fonctionne bien mais je reçois toujours les avertissements de compilation:

/* Sizeof.c--Program to tell byte size of the C variable */
#include <stdio.h>

int main(void) {
    printf("\nA Char is %d bytes", sizeof( char ));
    printf("\nAn int is %d bytes", sizeof( int ));
    printf("\nA short is %d bytes", sizeof( short ));
    printf("\nA long is %d bytes", sizeof( long ));
    printf("\nA long long is %d bytes\n", sizeof( long long ));
    printf("\nAn unsigned Char is %d bytes", sizeof( unsigned char ));
    printf("\nAn unsigned int is %d bytes", sizeof( unsigned int));
    printf("\nAn unsigned short is %d bytes", sizeof( unsigned short ));
    printf("\nAn unsigned long is %d bytes", sizeof( unsigned long ));
    printf("\nAn unsigned long long is %d bytes\n",
            sizeof( unsigned long long ));
    printf("\nfloat is %d bytes", sizeof( float ));
    printf("\nA double is %d bytes\n", sizeof( double ));
    printf("\nA long double is %d bytes\n", sizeof( long double ));

    return 0;

}
20
LuizGsa13

sizeof renvoie size_t vous devez utiliser %zu pour la chaîne de format au lieu de %d. Le type de entier non signé de size_t peut varier (en fonction de la plate-forme) et peut ne pas être long entier non signé partout, ce qui est couvert dans le projet de norme C99 section 6.5.3.4 L'opérateur sizeof paragraphe 4 :

La valeur du résultat est définie par l'implémentation et son type (un type entier non signé) est size_t, défini dans (et d'autres en-têtes).

Notez également que l'utilisation d'un spécificateur de format incorrect pour printf est un comportement non défini, qui est traité dans la section 7.19.6.1 La fonction fprintf , qui couvre également printf en ce qui concerne les spécificateurs de format, dit:

Si une spécification de conversion n'est pas valide, le comportement n'est pas défini.248) Si un argument n'est pas le type correct pour la spécification de conversion correspondante, le comportement n'est pas défini.

Mettre à jour

Visual Studione prend pas en charge le spécificateur de format z :

Les préfixes de longueur hh, j, z et t ne sont pas pris en charge.

le spécificateur de format correct dans ce cas serait %Iu.

26
Shafik Yaghmour

Le compilateur vous avertit que vous pouvez subir une perte de précision. Autrement dit, le spécificateur de format que vous utilisez pour imprimer un sizeof, %d, n'est pas capable d'imprimer la gamme complète de size_t. Changement %d à %zu et votre avertissement disparaîtra.

8
Fiddling Bits

j'ai eu le même problème sous Linux. le même programme s'exécute sans erreur dans Windows (signifie que "% d" a fonctionné sans erreur), mais pour Linux, j'ai dû remplacer tous les "% d" par "% lu" pour exécuter le programme.

3
Suraj