Страница 1 из 1

Где прочесть про формат файлв *.i?

Добавлено: 13.03.2018 01:28
жучара
Друзья! Это файлы *.c после препроцессирования, образуются так примерно:
gcc -E -o hello.i hello.c
Cпасибо, ко откликнется.

Re: Где прочесть про формат файлв *.i?

Добавлено: 13.03.2018 01:58
serzh-z
В стандарте C. Это обычный C-файл, после обработки включений и макросов.

Re: Где прочесть про формат файлв *.i?

Добавлено: 13.03.2018 22:16
жучара
serzh-z писал(а):
13.03.2018 01:58
В стандарте C. Это обычный C-файл, после обработки включений и макросов.

Вот стандарт Си и тут ничего об этом не написано.
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

Re: Где прочесть про формат файлв *.i?

Добавлено: 13.03.2018 23:04
Bizdelnick
жучара писал(а):
13.03.2018 22:16
Вот стандарт Си и тут ничего об этом не написано.

А что Вы там хотите найти? Это не какой-то отдельный формат, а простой сишный код со служебными отметками, откуда какие части взялись.
https://gcc.gnu.org/onlinedocs/cpp/Preprocessor-Output.html

Re: Где прочесть про формат файлв *.i?

Добавлено: 14.03.2018 21:36
жучара
Bizdelnick
Вот по-русски если:
Вывод С препроцессора выглядит примерно так же, как и ввод, только все строки с директивами заменяются на пустые и комментарии заменяются пробелами. Пробелы в середине строки не меняются. Однако пробел вставляется после большинства макроподстановок.

Имя исходного файла и информация о номере строки передается в строках следующей формы:

# LINENUM FILENAME FLAGS

которые вставляются в середину вводимого файла (но не в строчную или символьную константу). Появление такой строки означает, что следующая строка содержится в файле FILENAME и имеет порядковый номер LINENUM.

Но так-то это неправда.
++++++++++++++++++++++++++++++++
файл main.c
int main ()
{
}


Препроцессируем, смотрим вывод:
gcc -E -o main.i main.c


это main.i
# 1 "main.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 31 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 32 "<command-line>" 2
# 1 "main.c"
int main ()
{
}


Зададимся вопросом, что означает строка # 1 "main.c"? Так то и означает, что следующая строка содержится в файле FILENAME и имеет порядковый номер LINENUM.

Следующая это # 1 "<built-in>". FILENAME это main.c
Но # 1 "<built-in>" НЕ СОДЕРЖИТСЯ в main.c, вот в чём дело. Нехорошо как-то.

Re: Где прочесть про формат файлв *.i?

Добавлено: 15.03.2018 02:08
serzh-z
жучара писал(а):
14.03.2018 21:36
Но # 1 "<built-in>" НЕ СОДЕРЖИТСЯ в main.c, вот в чём дело. Нехорошо как-то.
Можно предположить по названию, что это просто все внутренние декларации libcpp. Насколько понимаю, при втором проходе компилятора лайнмаркеры вообще не используются или используются очень ограниченно - это просто наследие K&R.

Re: Где прочесть про формат файлв *.i?

Добавлено: 15.03.2018 09:31
Bizdelnick
жучара писал(а):
14.03.2018 21:36
Следующая это # 1 "<built-in>". FILENAME это main.c

FILENAME — это "<built-in>". Нетрудно догадаться, что это не реально существующий файл, а нечто, захардкоженное в компиляторе.

Re: Где прочесть про формат файлв *.i?

Добавлено: 15.03.2018 18:32
жучара
Bizdelnick писал(а):
15.03.2018 09:31
FILENAME — это "<built-in>".

Если мы рассматриваем строчку
# 1 "main.c"

, а мы именно её и рассмариваем, то для неё утверждение:
следующая строка содержится в файле FILENAME и имеет порядковый номер LINENUM.
означает, что FILENAME это "main.c". Но в нём следующая строка (# 1 "<built-in>") не содержится. Вопрос открыт.

Re: Где прочесть про формат файлв *.i?

Добавлено: 15.03.2018 19:09
Bizdelnick
жучара писал(а):
15.03.2018 18:32
следующая строка содержится в файле FILENAME и имеет порядковый номер LINENUM.

В данном случае следующая строка сама задаёт другой источник кода.
Да и не всё ли Вам равно? Эти строчки нужны только для того, чтобы компилятор мог определить, из какой строки какого файла взялся тот или иной кусок кода для генерации отладочной информации и вывода сообщений в ходе компиляции.