2017-07-18 7 views
1

Par cppreference.com le modificateur de longueur% L est valide uniquement pour les types de flottant. Mais la bibliothèque moderne du compilateur GNU & semble l'accepter aussi pour les entiers comme synonyme de% ll (long long). Y a-t-il une chance que cppreference commette une erreur? Ou est% L pour que les nombres entiers deviennent standard à l'avenir?Est-ce que modificateur de longueur printf% L standard (ou futur standard)?

+2

'% L' n'est pas un modificateur de longueur,' L' est. le '%' fait partie de la syntaxe de spécification de conversion. –

+0

'Mais le compilateur et la bibliothèque GNU modernes semblent l'accepter également pour les entiers comme synonyme de% ll (long long) .' ... source s'il vous plaît? –

+2

@ SouravGhosh-- Dans le [manuel de la glibc] (https://www.gnu.org/software/libc/manual/html_node/Integer-Conversions.html#Integer-Conversions): "' L', 'll', 'q' - Spécifie que l'argument est' long long int' .... " –

Répondre

4

De la dernière C11 projet N1570, §7.21.6.1 article 7:

L - Indique qu'une suite a, A, e, E, f, F, g ou G spécificateur de conversion s'applique à un argument long double.

Ainsi, votre source est correcte, L comme modificateur de longueur n'est définie pour virgule flottante conversions. Je ne m'attends pas à ce que cela change dans les versions futures, car il n'y en a tout simplement pas besoin. Il suffit d'utiliser l et ll selon le cas.

+1

Merci.C'était très tentant pour moi d'utiliser% L, il ressort visuellement et l'analyse est plus simple. Mais que ce soit% ll. – ddbug

3

Les modificateurs de longueur valides sont répertoriés in §7.21.6.1 7 de la norme C11.

La seule mention de L comme modificateur de longueur dans la norme est de long double types:

L Spécifie qu'une suite a, A, e, e, f, f, g, ou la conversion G spécificateur s'applique à un long argument double.

De plus, il n'y a aucune mention de cela dans §7.31 Future Library Directions:

7.31.11 entrée/sortie < stdio.h>

  • 1 Minuscules peuvent être ajoutés à la conversion spécificateurs et modificateurs de longueur dans fprintf et fscanf. D'autres caractères peuvent être utilisés dans les extensions.

  • 2 L'utilisation de ungetc sur un flux binaire où l'indicateur de position de fichier est nul avant l'appel est une fonction obsolète.

Et, la même utilisation de L détient dans the POSIX Standard: L est un modificateur de longueur à utiliser avec long double types seulement.

+0

'Et, ce n'est pas non plus un modificateur de longueur mentionné dans le standard POSIX. '... ai-je oublié quelque chose? –

+0

Merci aussi. . . – ddbug

+0

@ SouravGhosh - peut-être qu'il me manque quelque chose;) Je fournissais juste le détail que 'L' n'est pas seulement standard dans cette utilisation dans le sens ISO C, mais n'est même pas standard dans le sens POSIX ... mais je devrait clarifier ma formulation. –