Подтвердить что ты не робот

В чем смысл строк, начинающихся с символа хэша и числа, такого как "# 1" a.c "" в выводе препроцессора gcc?

Я распечатываю вывод препроцессора 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. Может ли кто-нибудь объяснить, что это делает?

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

gcc -E -P source.c

См. подробную документацию (ответьте ранее).

Ответ 3

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