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

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

Ответить
Аватара пользователя
жучара
Сообщения: 937
ОС: астралинукс

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

Сообщение жучара »

Друзья! Это файлы *.c после препроцессирования, образуются так примерно:
gcc -E -o hello.i hello.c
Cпасибо, ко откликнется.
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu
Контактная информация:

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

Сообщение serzh-z »

В стандарте C. Это обычный C-файл, после обработки включений и макросов.
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 937
ОС: астралинукс

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

Сообщение жучара »

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

Вот стандарт Си и тут ничего об этом не написано.
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

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

Сообщение Bizdelnick »

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

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

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

Сообщение жучара »

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
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu
Контактная информация:

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

Сообщение serzh-z »

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

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

Сообщение Bizdelnick »

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

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

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

Сообщение жучара »

Bizdelnick писал(а):
15.03.2018 09:31
FILENAME — это "<built-in>".

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

, а мы именно её и рассмариваем, то для неё утверждение:
следующая строка содержится в файле FILENAME и имеет порядковый номер LINENUM.
означает, что FILENAME это "main.c". Но в нём следующая строка (# 1 "<built-in>") не содержится. Вопрос открыт.
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

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

Сообщение Bizdelnick »

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

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