Comment utiliser “zd” spécificateur avec " printf()`?

À la recherche pour obtenir des éclaircissements sur l'utilisation de "zd" avec printf().

Certainement la suivante est correcte avec le C99 et plus tard.

void print_size(size_t sz) {
  printf("%zu\n", sz);
}

Le C spec semble permettre printf("%zd\n", sz) en fonction de sa façon de lire:

7.21.6.1 La fprintf fonction

z Spécifie que l'un des suivants d, i, o, u, x, ou X indicateur de conversion s'applique à un size_t ou le correspondant entier signé argument de type; ou qu'un n indicateur de conversion s'applique à un pointeur vers un entier signé de type correspondant à size_t argument. C11dr §7.21.6.1 7

Cela devrait-il être lu comme

  1. "z Spécifie qu'un d ... spécificateur de conversion s'applique à un size_t ou le correspondant entier signé argument de type ... "(deux types) et "z Spécifie qu'un u ... spécificateur de conversion s'applique à un size_t ou le correspondant entier signé argument de type ..." (deux types)

OU

  1. "z Spécifie qu'un d ... spécificateur de conversion s'applique à un correspondant entier signé argument de type ..." (signé) et "z Spécifie qu'un u ... spécificateur de conversion s'applique à un size_t" (non signé).

J'ai été en utilisant le #2 de la définition, mais maintenant, pas si sûr.

Ce qui est correct, 1, 2, ou quelque chose d'autre?

Si #2 est correcte, ce qui est un exemple d'un type qui peut utiliser "%zd"?

OriginalL'auteur chux | 2015-10-02