web-dev-qa-db-fra.com

Mmh, qui êtes-vous PRIu64?

Je suis nouveau chez C et je suis confronté à:

#include <stdio.h>
#include <inttypes.h>

int main(void)
{
    uint64_t foo = 10;
    printf("foo is equal to %" PRIu64 "!\n", foo);

    return 0;
}

Et il fonctionne! Je ne comprends pas pourquoi? Quelqu'un peut-il m'aider à ce sujet? Merci beaucoup! Torr

53
torr

PRIu64 est un spécificateur de format, introduit dans C99, pour l'impression uint64_t, où uint64_t est (à partir de la page de référence liée):

type entier non signé d'une largeur de ... 64 bits respectivement (fourni uniquement si l'implémentation prend directement en charge le type)

PRIu64 est une chaîne (littérale), par exemple la suivante:

printf("%s\n", PRIu64);

imprime llu sur ma machine. Les littéraux de chaîne adjacents sont concaténés, à partir de la section 6.4.5 Littéraux de chaîne de la norme C99:

Dans la phase de traduction 6, les séquences de caractères multi-octets spécifiées par n'importe quelle séquence de jetons de caractères adjacents et de chaînes larges sont concaténées en une seule séquence de caractères multi-octets . Si l'un des jetons est un jeton littéral de chaîne large, la séquence de caractères multi-octets résultante est traitée comme un littéral de chaîne large; sinon, il est traité comme un littéral de chaîne de caractères.

Ça signifie:

printf("foo is equal to %" PRIu64 "!\n", foo);

(sur ma machine) est identique à:

printf("foo is equal to %llu!\n", foo);

Voir http://ideone.com/jFvKR9 .

66
hmjd