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

Модератор: Модераторы разделов

Аватара пользователя
жучара
Сообщения: 132
ОС: minix 3.1.0

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

Сообщение жучара » 13.03.2018 01:28

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

Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 7157
Статус: Маньяк
ОС: Android, GNU/Linux, Windows

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

Сообщение serzh-z » 13.03.2018 01:58

В стандарте C. Это обычный C-файл, после обработки включений и макросов.
Scio me nihil scire.
Спасибо сказали:

Аватара пользователя
жучара
Сообщения: 132
ОС: minix 3.1.0

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
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 14129
Статус: grammatikführer
ОС: Debian GNU/Linux

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

Сообщение Bizdelnick » 13.03.2018 23:04

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

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

Аватара пользователя
жучара
Сообщения: 132
ОС: minix 3.1.0

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, вот в чём дело. Нехорошо как-то.
Спасибо сказали:

Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 7157
Статус: Маньяк
ОС: Android, GNU/Linux, Windows

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

Сообщение serzh-z » 15.03.2018 02:08

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

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 14129
Статус: grammatikführer
ОС: Debian GNU/Linux

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

Сообщение Bizdelnick » 15.03.2018 09:31

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

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

Аватара пользователя
жучара
Сообщения: 132
ОС: minix 3.1.0

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>") не содержится. Вопрос открыт.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 14129
Статус: grammatikführer
ОС: Debian GNU/Linux

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

Сообщение Bizdelnick » 15.03.2018 19:09

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

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

Вернуться в «Программирование»