Qual é o significado de linhas começando com um sinal de hash e número como ‘# 1’ ac ” na saída do pré-processador do gcc?

Eu imprimo a saída do pré-processador C usando

gcc -E ac 

A saída contém muitas linhas como

 # 1 "ac" # 1 "" # 1 "" # 1 "ac" # 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 

Eu nunca vi esse tipo de syntax em C. Alguém pode explicar o que isso está fazendo?

Essas linhas são dicas para debugging (onde o código após a linha realmente veio)

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

Significado das bandeiras (separadas por espaço):

  • 1 – Início de um novo arquivo
  • 2 – Retornando ao arquivo anterior
  • 3 – O texto a seguir vem de um arquivo de header do sistema (#include <> vs #include “”)
  • 4 – O texto a seguir deve ser tratado como envolvido em um bloco externo implícito “C”.

Esses linemarkers são mencionados no man gcc para a opção -P .

A opção -P destina-se especificamente a se livrar dessas linhas para maior clareza:

 gcc -E -P source.c 

Veja a documentação detalhada (respondida antes).

Essas são diretivas de synchronization de linha, que permitem ao gcc fornecer mensagens de erro corretas para erros em arquivos #include d. Outros pré-processadores (como o yacc / bison ) usam o mesmo mecanismo para relacionar erros C às linhas corretas no arquivo .y input.