формат вывода предварительной обработки gcc

#gcc #clang #c-preprocessor

#gcc #clang #c-препроцессор

Вопрос:

Я вижу следующий вывод предварительной обработки gcc. Я не нахожу документацию по формату вывода. Может ли кто-нибудь сообщить мне, что это такое? Спасибо.

 $ cat a.h
#include "b.h"
$ cat b.h
#define X Y
$ gcc -E -dD - <<< '#include "a.h"'
...
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "<stdin>" 2
# 1 "./a.h" 1
# 1 "./b.h" 1
#define X Y
# 2 "./a.h" 2
# 2 "<stdin>" 2

 

Когда я пытаюсь выполнить следующее, я вижу больше чисел, которые отличаются от приведенных выше. Я тоже не уверен в том, что они означают.

 $ gcc -E -dD - <<< '#include <sys/socket.h>'
...
# 19 "/usr/include/x86_64-linux-gnu/asm/posix_types_64.h" 2 3 4
# 8 "/usr/include/x86_64-linux-gnu/asm/posix_types.h" 2 3 4
# 37 "/usr/include/linux/posix_types.h" 2 3 4
# 6 "/usr/include/asm-generic/socket.h" 2 3 4
# 1 "/usr/include/x86_64-linux-gnu/asm/sockios.h" 1 3 4
# 1 "/usr/include/asm-generic/sockios.h" 1 3 4
...
 

Ответ №1:

Необычные строки — это метки строки, которые указывают номер строки и имя файла. Числа после имени файла являются специальными флагами.

Это объясняется в онлайн-документации по препроцессору GCC:

Информация об имени исходного файла и номере строки передается строками вида

# linenum filename flags

Они называются маркерами линий. Они вставляются по мере необходимости в выходные данные (но никогда в пределах строковой или символьной константы). Они означают, что следующая строка возникла в файле filename в строке linenum. имя файла никогда не будет содержать непечатаемых символов; они заменяются восьмеричными escape-последовательностями.

После имени файла следует ноль или более флагов, которые ‘1’, ‘2’, ‘3’, или ‘4’. Если имеется несколько флагов, их разделяют пробелы. Вот что означают флаги:

‘1’ Это указывает на начало нового файла.
‘2’ Это указывает на возврат к файлу (после включения другого файла).
‘3’ Это указывает на то, что следующий текст поступает из системного заголовочного файла, поэтому некоторые предупреждения должны быть подавлены.
‘4’ Это указывает на то, что следующий текст следует рассматривать как заключенный в неявный внешний блок «C».