Cпасибо, ко откликнется.gcc -E -o hello.i hello.c
Где прочесть про формат файлв *.i?
Модератор: Модераторы разделов
Где прочесть про формат файлв *.i?
Друзья! Это файлы *.c после препроцессирования, образуются так примерно:
Я просто читаю маны.
- serzh-z
- Бывший модератор
- Сообщения: 8259
- Статус: Маньяк
- ОС: Arch, Fedora, Ubuntu
- Контактная информация:
Re: Где прочесть про формат файлв *.i?
В стандарте C. Это обычный C-файл, после обработки включений и макросов.
Спасибо сказали:
Re: Где прочесть про формат файлв *.i?
Вот стандарт Си и тут ничего об этом не написано.
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf
Я просто читаю маны.
- Bizdelnick
- Модератор
- Сообщения: 20791
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Где прочесть про формат файлв *.i?
А что Вы там хотите найти? Это не какой-то отдельный формат, а простой сишный код со служебными отметками, откуда какие части взялись.
https://gcc.gnu.org/onlinedocs/cpp/Preprocessor-Output.html
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Re: Где прочесть про формат файлв *.i?
Bizdelnick
Вот по-русски если:
Но так-то это неправда.
++++++++++++++++++++++++++++++++
файл main.c
Препроцессируем, смотрим вывод:
это main.i
Зададимся вопросом, что означает строка # 1 "main.c"? Так то и означает, что следующая строка содержится в файле FILENAME и имеет порядковый номер LINENUM.
Следующая это # 1 "<built-in>". FILENAME это main.c
Но # 1 "<built-in>" НЕ СОДЕРЖИТСЯ в main.c, вот в чём дело. Нехорошо как-то.
Вот по-русски если:
Вывод С препроцессора выглядит примерно так же, как и ввод, только все строки с директивами заменяются на пустые и комментарии заменяются пробелами. Пробелы в середине строки не меняются. Однако пробел вставляется после большинства макроподстановок.
Имя исходного файла и информация о номере строки передается в строках следующей формы:
# 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?
Можно предположить по названию, что это просто все внутренние декларации libcpp. Насколько понимаю, при втором проходе компилятора лайнмаркеры вообще не используются или используются очень ограниченно - это просто наследие K&R.
- Bizdelnick
- Модератор
- Сообщения: 20791
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Где прочесть про формат файлв *.i?
FILENAME — это "<built-in>". Нетрудно догадаться, что это не реально существующий файл, а нечто, захардкоженное в компиляторе.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Re: Где прочесть про формат файлв *.i?
Если мы рассматриваем строчку
# 1 "main.c"
, а мы именно её и рассмариваем, то для неё утверждение:
следующая строка содержится в файле FILENAME и имеет порядковый номер LINENUM.
означает, что FILENAME это "main.c". Но в нём следующая строка (# 1 "<built-in>") не содержится. Вопрос открыт.
Я просто читаю маны.
- Bizdelnick
- Модератор
- Сообщения: 20791
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Где прочесть про формат файлв *.i?
В данном случае следующая строка сама задаёт другой источник кода.
Да и не всё ли Вам равно? Эти строчки нужны только для того, чтобы компилятор мог определить, из какой строки какого файла взялся тот или иной кусок кода для генерации отладочной информации и вывода сообщений в ходе компиляции.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |