web-dev-qa-db-fra.com

Quelle est la signification des lignes commençant par un signe de hachage et un nombre comme '# 1 "a.c"' dans la sortie du préprocesseur gcc?

J'imprime la sortie du préprocesseur C en utilisant

gcc -E a.c

La sortie contient de nombreuses lignes comme

# 1 "a.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "a.c"
# 1 "c:\\mingw\\bin\\../lib/gcc/mingw32/4.5.0/../../../../include/stdio.h" 1 3
# 19 "c:\\mingw\\bin\\../lib/gcc/mingw32/4.5.0/../../../../include/stdio.h" 3
# 1 "c:\\mingw\\bin\\../lib/gcc/mingw32/4.5.0/../../../../include/_mingw.h" 1 3
# 31 "c:\\mingw\\bin\\../lib/gcc/mingw32/4.5.0/../../../../include/_mingw.h" 3

# 32 "c:\\mingw\\bin\\../lib/gcc/mingw32/4.5.0/../../../../include/_mingw.h" 3
# 20 "c:\\mingw\\bin\\../lib/gcc/mingw32/4.5.0/../../../../include/stdio.h" 2 3

Je n'ai jamais vu ce type de syntaxe en C. Quelqu'un peut-il expliquer ce que cela fait?

59
user607722

Ces lignes sont des astuces pour le débogage (d'où vient le code qui suit la ligne)

# line-number "source-file" [flags]

Signification des drapeaux (séparés par des espaces):

  • 1 - Début d'un nouveau fichier
  • 2 - Retour au fichier précédent
  • 3 - Le texte suivant provient d'un fichier d'en-tête système (#include <> vs #include "")
  • 4 - Le texte suivant doit être traité comme étant enveloppé dans un bloc externe "C" implicite.
75
jdehaan

Ces marqueurs de ligne sont mentionnés dans man gcc pour -P option.

Le -P option est spécifiquement destinée à supprimer ces lignes pour plus de clarté:

gcc -E -P source.c

Voir documentation détaillée (réponse précédente).

44
uvsmtid

Ce sont des directives de synchronisation de ligne, qui permettent à gcc de donner des messages d'erreur corrects pour les erreurs dans #included fichiers. D'autres préprocesseurs (tels que yacc/bison) utilisent le même mécanisme pour relier les erreurs C aux lignes correctes dans l'entrée .y fichier.

1
geekosaur