2017-06-07 2 views
1

Thi est confirmée également dans printf (3) manpage:C99 standard et gnu libc printf

L

A suivant un, A, e, E, f, F, g, ou g conversion correspond à un long double argument.

Si je compile ceci:

printf("%Ld",3); 

utilisant std = c99 argument de gcc, je reçois un avertissement:

warning: format ‘%Ld’ expects argument of type ‘long long int’, but argument 2 has type ‘int’ [-Wformat=] 
    printf("%Ld",3); 
     ^

Il semble que gnu libc ne folloe pas standard c99

Je gcc 6.3.0, gnu libc 2,24, mon hôte est un linux ubuntu 17.04 64bit

[Modifié]

si je compilez ceci:

printf("%Ld\n",3); 
printf("%lld\n", 3LL); 
printf("%Lf\n", 3.3L); 
printf("%llf\n", 3.3L); 
printf("%f\n", 3.3L); 

Je reçois:

warning: format ‘%Ld’ expects argument of type ‘long long int’, but argument 2 has type ‘int’ [-Wformat=] 
    printf("%Ld\n",3); 
      ^
warning: use of ‘ll’ length modifier with ‘f’ type character has either no effect or undefined behavior [-Wformat=] 
    printf("%llf\n", 3.3L); 
      ^
warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘long double’ [-Wformat=] 
    printf("%f\n", 3.3L); 
     ^

Ainsi, le message d'avertissement est attendu comme pour %llf.

avec -pedantic je reçois des messages plus verbeux:

warning: ISO C does not support the ‘%Ld’ gnu_printf format [-Wformat=] 
    printf("%Ld\n",3); 
      ^
warning: format ‘%Ld’ expects argument of type ‘long long int’, but argument 2 has type ‘int’ [-Wformat=] 
warning: use of ‘ll’ length modifier with ‘f’ type character has either no effect or undefined behavior [-Wformat=] 
    printf("%llf\n", 3.3L); 
      ^
warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘long double’ [-Wformat=] 
    printf("%f\n", 3.3L); 
      ^

[Edité]

J'ai un mail from gcc ML

il semble que '% Ld' est autorisé et nécessitent 'long long int'.

Mais c'est autorisé par GNU libc, c'est le point. Pour GNU libc% Ld signifie la même chose que% LLD, mais c'est non-standard, lorsque vous utilisez -pedantic vous obtenez un avertissement.

Et cela explique le message d'avertissement.

+1

Il semble que votre code ne respecte pas la norme. Qu'attendiez-vous de% Ld? – Sneftel

+0

@Sneftel C'est toujours une question intéressante. Le réchauffement est trompeur, je dirais. Et je me demande ce que la sortie avec '-pedantic' est. –

+0

@Sneftel - '% Ld' n'est pas couvert par la norme, et son comportement est indéfini. Dans un code source je l'ai écrit accidentellement, et l'avertissement gcc m'a semblé étrange @AndrewHenle - J'ai ajouté le '-pedantic'output à la poste orifinal – mastupristi

Répondre

1

La norme dit:

Si un modificateur de longueur apparaît avec un indicateur de conversion autre que comme indiqué ci-dessus, le comportement est indéfini.

Dans ce cas, l'agent modifiant la longueur L est pas spécifié pour une utilisation avec le spécificateur de conversion d, de sorte que le comportement est indéfini.

Vraisemblablement, gcc (c'est gcc qui vous donne l'avertissement, pas libc) utilise le même drapeau interne pour les doubles longs et les longs longs. Ce serait bien si l'avertissement était plus précis, mais il n'est pas nécessaire de vous avertir du tout (ou de faire quoi que ce soit d'autre en particulier), donc c'est suivre correctement la norme.

+0

Je suis seulement perplexe et désorienté à propos du message d'avertissement gcc – mastupristi