В чем смысл строк, начинающихся с символа хэша и числа, такого как "# 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. Может ли кто-нибудь объяснить, что это делает?
Ответы
Ответ 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
.