Предупреждение компилятора “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; после этого.

  • C # Пустое заявление
  • Компиляция с помощью g ++ с использованием нескольких ядер
  • Предупреждение компилятора - предлагать круглые скобки вокруг присваивания, используемые как значение истины
  • Как работает процесс компиляции / связывания?
  • go работает отлично, но не работает
  • Можно ли установить компилятор C # без Visual Studio?
  • Не удалось загрузить файл или сборку ... Параметр неверен
  • Как отключить предупреждения компилятора в Eclipse на основе файлов?
  • Как определить, было ли приложение .NET скомпилировано в режиме DEBUG или RELEASE?
  • error: writeable atomic property не может спаривать синтезированный setter / getter с определенным пользователем setter / getter
  • Непреднамеренное использование = вместо ==
  • Interesting Posts

    Как получить ручки всех открытых фигур в MATLAB

    Как получить Likes Count при поиске Facebook Graph API с помощью поиска = xxx

    Как встроить шрифты в CSS?

    Перемещение папки ProgramData Windows 7 после установки

    Отсутствие свободного места в разделе с Windows 8

    Каков метод замещения этого устаревшего вызова MagicalRecord?

    Почему я получаю «Исключение; должен быть пойман или объявлен брошенным “, когда я пытаюсь скомпилировать свой Java-код?

    Есть ли константа Newline, определенная в Java, например Environment.Newline в C #?

    Зеленая полоса поверх каждого (сетевого) видео, искаженные цвета тоже

    MVC 3 – Html.EditorFor, похоже, кэширует старые значения после вызова $ .ajax

    Вложение изображения в приложение Shiny

    Количество вкладок в Chrome или Firefox

    Исправить суффикс для исходного файла Fortran 2003 – компилятор Intel Fortran

    «Метод сравнения нарушает общий контракт!» – TimSort и GridLayout

    Я хотел бы изменить, как клавиша FN влияет на функциональные клавиши на Lenovo IdeaPad z500

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