Что означает строки, начинающиеся со знака хеша и числа, такого как «# 1« a.c »» в выходных данных препроцессора gcc? - PullRequest
58 голосов
/ 20 марта 2011

Я распечатываю вывод препроцессора C, используя

gcc -E a.c

Вывод содержит много строк, таких как

# 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

Я никогда не видел такого синтаксиса в C. Может кто-нибудь объяснить, что это делает?

Ответы [ 3 ]

74 голосов
/ 20 марта 2011

Эти строки являются подсказками для отладки (откуда на самом деле пришел код, следующий за строкой)

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

Значение флагов (разделенных пробелами):

  • 1 - Началоновый файл
  • 2 - возврат к предыдущему файлу
  • 3 - следующий текст взят из системного заголовочного файла (#include <> vs #include "")
  • 4 -Следующий текст следует рассматривать как заключенный в неявный внешний блок "C".
44 голосов
/ 01 августа 2012

Эти линейные маркеры упоминаются в man gcc для опции -P.

Опция -P специально предназначена для избавления от этих строк для ясности:

gcc -E -P source.c

См. подробная документация (ответ до этого).

1 голос
/ 20 марта 2011

Это директивы линейной синхронизации, которые позволяют gcc выдавать правильные сообщения об ошибках в файлах #include d.Другие препроцессоры (такие как yacc / bison) используют тот же механизм для соотнесения ошибок C с правильными строками во входном файле .y.

...