[C] EOL в конце файла

stm7868162

А с чем связано требование многих компиляторов на наличие символа конца строки в конце файла?
Точнее - иногда выдаётся предупреждение "No newline at the end of file"

ppplva

Если в хедере последней строчкой - #define какой-нибудь ...

Maurog

что ты сказал?

yolki

Если файл не заканчивается на EOL, возможно возникнут трудности у препроцессора, если этот файл кто-то заинклюдит.

Maurog

а ты что сказал?=)
ну в чем трудность-то?
поставить самому этот ньюлайн?
это может изменить функциональность?

ppplva

Да, может.
поставить самому этот ньюлайн?
Может пусть вообще программу за тебя напишет ?

Maurog

может сделать ворнинг, когда два пробела подряд стоит?
ато он мучается и убирает их=\

Maurog

вопрос все же считаю открытым
почему ругается компилятор?
ведь должно быть более нормальное объяснение, чем тут привели уже.

vall

а чем тебе это не нравится?
в препроцессоре перевод строки это значащий символ.
если в конце файла нет перевода тогда возможно образование команд препроцессора разбросанных по нескольким файлам - что плохо, т.к. не позволяет обрабатывать файлы по отдельности.

Ivan8209

Потому что Си --- это УНИКС,
а в УНИКС каждая строка должна быть завершена.
Всё остальное --- отговорки.
---
A24: Проявления suxx-а неисчислимы.

Maurog

необходимый перенос строки уже есть после команды
#include "myfile.h"
ведь ругается препроцессор, а не компилятор, как я понимаю

vall

необходимый перенос строки уже есть после команды
#include "myfile.h"
этот перенос строки является частью команды препроцессора.

Ivan8209

1. Никто не мешает препроцессору вставлять недостающий конец строки.
2. Если препроцессор считает, что файл должен быть текстовым в понятиях уникс,
то он может отругаться, но поставить недостающий конец строки.
---
A24: Проявления suxx-а неисчислимы.

Maurog

если в конце файла нет перевода тогда возможно образование команд препроцессора разбросанных по нескольким файлам - что плохо, т.к. не позволяет обрабатывать файлы по отдельности.
не понял почему это?
напишите мне чудо, чтобы компилятор не смог обрабатывать файлы по одиночке.
(если ентера нет в конце и даже если слиплись команды из .h и .c файлов) препроцессор сформирует корректный единый файл для компилятора. и компилятор как и прежде будет компилить один файл.
зы: а слипнуться ли команды?
если в .h
написано
"#define abs(x) " (ентера нету)
а в си написано
#include "myfile.h" (x>0)?x:-x
никак не допетрю где же проблемы будут
я так понимаю, что инклюд сглюкнет

vall

#include "a.h"
#include "b.h"
если в a.h нет в конце перевода строки то отдельно обработать b.h низя - хз какая там хрень слепится.
только не надо рассказывать что по стандарту компилятор должен в начале полностью прогнать препроцессор и получить многометровую портянку.

Maurog

я не знаю, чо там по стандарту, но предполагаю, что именно портянку ему и надо сделать, чтобы компилять

Maurog

я не говорю про прекомпайлд хедерс (под виндой этих ворнингов нет)
я про CC and gcc

Dasar

> Точнее - иногда выдаётся предупреждение "No newline at the end of file"
Ноги это явления, как и многих остальных закидонов C/C++, растут из далеких времен, когда программы были маленькими, а дискеты - большими.
В те времена - препроцессор и компилятор - представляли собой две совершенно разные программы.
Препроцессор - обрабатывает файлы, а компилятор - их компилит.
т.к. и препроцессор был программой маленькой - то написан он был очень просто - читаем файл, ищем include-ы и макросы, и на их места вставляем содержимое файлов или define-ов.
при такой схеме: если в конце файла не поставить перевод строки, то при последовательных include-ах, последняя строка первого файла сольется в одну строку с первой строкой последующего файла.
Соответственно - если, например, в последней строке первого файла стоял строчный комментарий (// то первую строку последующего файла - тоже окажется закомментированной.
т.к. компиляторов C/C++ сейчас целый зоопарк, и совсем непонятно - каким компилятором будет собираться проект в следующий раз - то приличные компиляторы стараются предупредить указанные выше проблему, и выдают такой warning.

Maurog

во...
единственный правдоподобный ответ
спасибо.
вопросов больше не имею)
Оставить комментарий
Имя или ник:
Комментарий: