[C] EOL в конце файла
Если в хедере последней строчкой - #define какой-нибудь ...
что ты сказал?
Если файл не заканчивается на EOL, возможно возникнут трудности у препроцессора, если этот файл кто-то заинклюдит.
ну в чем трудность-то?
поставить самому этот ньюлайн?
это может изменить функциональность?
поставить самому этот ньюлайн?Может пусть вообще программу за тебя напишет ?
ато он мучается и убирает их=\
почему ругается компилятор?
ведь должно быть более нормальное объяснение, чем тут привели уже.
в препроцессоре перевод строки это значащий символ.
если в конце файла нет перевода тогда возможно образование команд препроцессора разбросанных по нескольким файлам - что плохо, т.к. не позволяет обрабатывать файлы по отдельности.
а в УНИКС каждая строка должна быть завершена.
Всё остальное --- отговорки.
---
A24: Проявления suxx-а неисчислимы.
#include "myfile.h"
ведь ругается препроцессор, а не компилятор, как я понимаю
необходимый перенос строки уже есть после командыэтот перенос строки является частью команды препроцессора.
#include "myfile.h"
2. Если препроцессор считает, что файл должен быть текстовым в понятиях уникс,
то он может отругаться, но поставить недостающий конец строки.
---
A24: Проявления suxx-а неисчислимы.
если в конце файла нет перевода тогда возможно образование команд препроцессора разбросанных по нескольким файлам - что плохо, т.к. не позволяет обрабатывать файлы по отдельности.не понял почему это?
напишите мне чудо, чтобы компилятор не смог обрабатывать файлы по одиночке.
(если ентера нет в конце и даже если слиплись команды из .h и .c файлов) препроцессор сформирует корректный единый файл для компилятора. и компилятор как и прежде будет компилить один файл.
зы: а слипнуться ли команды?
если в .h
написано
"#define abs(x) " (ентера нету)
а в си написано
#include "myfile.h" (x>0)?x:-x
никак не допетрю где же проблемы будут
я так понимаю, что инклюд сглюкнет
#include "b.h"
если в a.h нет в конце перевода строки то отдельно обработать b.h низя - хз какая там хрень слепится.
только не надо рассказывать что по стандарту компилятор должен в начале полностью прогнать препроцессор и получить многометровую портянку.
я не знаю, чо там по стандарту, но предполагаю, что именно портянку ему и надо сделать, чтобы компилять
я про CC and gcc
Ноги это явления, как и многих остальных закидонов C/C++, растут из далеких времен, когда программы были маленькими, а дискеты - большими.
В те времена - препроцессор и компилятор - представляли собой две совершенно разные программы.
Препроцессор - обрабатывает файлы, а компилятор - их компилит.
т.к. и препроцессор был программой маленькой - то написан он был очень просто - читаем файл, ищем include-ы и макросы, и на их места вставляем содержимое файлов или define-ов.
при такой схеме: если в конце файла не поставить перевод строки, то при последовательных include-ах, последняя строка первого файла сольется в одну строку с первой строкой последующего файла.
Соответственно - если, например, в последней строке первого файла стоял строчный комментарий (// то первую строку последующего файла - тоже окажется закомментированной.
т.к. компиляторов C/C++ сейчас целый зоопарк, и совсем непонятно - каким компилятором будет собираться проект в следующий раз - то приличные компиляторы стараются предупредить указанные выше проблему, и выдают такой warning.
единственный правдоподобный ответ
спасибо.
вопросов больше не имею)
Оставить комментарий
stm7868162
А с чем связано требование многих компиляторов на наличие символа конца строки в конце файла?Точнее - иногда выдаётся предупреждение "No newline at the end of file"