Предупреждение компилятора “No newline at end of file”

В чем причина следующего предупреждения в некоторых компиляторах на C ++?

Нет строки в конце файла

Почему у меня должна быть пустая строка в конце файла источника / заголовка?

    Подумайте о некоторых проблемах, которые могут возникнуть, если нет новой строки. Согласно стандарту ANSI #include файла в начале вставляет файл точно так же, как и перед файлом, и не вставляет новую строку после #include после содержимого файла. Поэтому, если вы включаете файл без новой строки в конце анализатора, он будет выглядеть так, как если бы последняя строка foo.h в той же строке, что и первая строка foo.cpp . Что, если последняя строка foo.h была комментарием без новой строки? Теперь прокомментирована первая строка foo.cpp . Это всего лишь несколько примеров проблем, которые могут возникнуть.

    Редактировать : просто хотел указать любые заинтересованные стороны на ответ Джеймса ниже. Хотя приведенный выше ответ по-прежнему верен для C, новый стандарт C ++ (C ++ 11) был изменен, поэтому это предупреждение больше не должно выдаваться при использовании C ++ и совместимого компилятора C ++ 11.

    Из стандарта C ++ 11 через пост Джеймса:

    Исходный файл, который не является пустым и который не заканчивается символом новой строки или заканчивается символом новой строки, которому предшествует символ обратной косой черты перед тем, как произойдет какое-либо такое сращивание, обрабатывается так, как если бы новый, в файл добавлен строковый символ (C ++ 11 §2.2 / 1).

    Требование, чтобы каждый исходный файл заканчивался неэкспертированной новой линией, был удален в C ++ 11. В спецификации теперь говорится:

    Исходный файл, который не является пустым и который не заканчивается символом новой строки или заканчивается символом новой строки, которому предшествует символ обратной косой черты перед тем, как произойдет какое-либо такое сращивание, обрабатывается так, как если бы новый, в файл добавлен строковый символ (C ++ 11 §2.2 / 1).

    Соответствующий компилятор больше не должен выдавать это предупреждение (по крайней мере, не при компиляции в режиме C ++ 11, если у компилятора есть режимы для разных версий спецификации языка).

    Стандарт C ++ 03 [2.1.1.2] объявляет:

    … Если исходный файл, который не пуст, не заканчивается символом новой строки или заканчивается символом новой строки, которому предшествует символ обратной косой черты перед тем, как произойдет какое-либо такое сращивание, поведение не определено.

    Ответ для «послушного» – «потому что стандарт C ++ 03 говорит, что поведение программы, не заканчивающееся на новой строке, не определено» (перефразировано).

    Ответ на любопытный здесь: http://gcc.gnu.org/ml/gcc/2001-07/msg01120.html .

    Это не относится к пустой строке, это то, будет ли последняя строка (которая может содержать содержимое в ней) заканчивается новой строкой.

    Большинство текстовых редакторов помещают новую строку в конец последней строки файла, поэтому, если в последней строке нет ее, существует риск, что файл был усечен. Однако есть веские причины, по которым вам может не понадобиться новая строка, поэтому это всего лишь предупреждение, а не ошибка.

    #include заменит свою строку литеральным содержимым файла. Если файл не заканчивается новой строкой, строка, содержащая #include которая втягивает ее, будет сливаться со следующей строкой.

    Я использую c-free IDE версии 5.0, в моей прогрме либо из языка «c ++», либо «c» я получал такую ​​же проблему. Обычно в конце программы, т.е. последней строке программы (после фигурных скобок функции она может быть основной или любой функции), нажмите enter -line no. будет увеличено на 1. Затем выполните ту же программу, она будет работать без ошибок.

    Конечно, на практике каждый компилятор добавляет новую строку после #include. К счастью. – @mxcl

    не специфический C / C ++, а диалект C: при использовании расширения GL_ARB_shading_language_include компилятор glsl на OS X предупреждает вас об отсутствии новой строки. Поэтому вы можете написать файл MyHeader.h с защитой заголовка, которая заканчивается на #endif // __MY_HEADER_H__ и вы потеряете строку после #include "MyHeader.h" .

    Поскольку поведение отличается от версий C / C ++, если файл не заканчивается новой строкой. Особенно противный – это старше C ++ – версии, fx в C ++ 03, в стандарте говорится (фазы перевода):

    Если исходный файл, который не является пустым, не заканчивается символом новой строки или заканчивается символом новой строки, которому предшествует символ обратной косой черты, поведение не определено.

    Неопределенное поведение плохое: стандартный совместимый компилятор может делать больше или меньше того, что он хочет здесь (вставить вредоносный код или что-то еще) – явно причина для предупреждения.

    Хотя ситуация на C ++ 11 лучше, рекомендуется избегать ситуаций, когда поведение не определено в более ранних версиях. Спецификация C ++ 03 хуже, чем C99, которая прямо запрещает такие файлы (поведение затем определяется).

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

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

    Это не ошибка. Это просто предупреждение.

    Откройте файл в редакторе, перейдите к последней строке файла и нажмите enter, чтобы добавить пустую строку в конец файла.

    Хотя, кроме того, вы должны использовать #include вместо . Затем добавьте using std::cout; после этого.

    Давайте будем гением компьютера.