Предупреждение компилятора "No newline at end of file"
В чем причина следующего предупреждения в некоторых компиляторах на С++?
Нет строки в конце файла
Зачем мне пустую строку в конце файла источника/заголовка?
Ответы
Ответ 1
Подумайте о некоторых проблемах, которые могут возникнуть, если нет новой строки. Согласно стандарту ANSI #include
файла в начале вставляет файл точно так же, как и перед файлом, и не вставляет новую строку после #include <foo.h>
после содержимого файла. Поэтому, если вы включаете файл без новой строки в конце анализатора, он будет выглядеть так, как если бы последняя строка foo.h
находилась в той же строке, что и первая строка foo.cpp
. Что, если последняя строка foo.h была комментарием без новой строки? Теперь прокомментирована первая строка foo.cpp
. Это всего лишь несколько примеров типов проблем, которые могут появиться.
Изменить: просто хотел указать любые заинтересованные стороны на ответ Джеймса ниже. Хотя вышеприведенный ответ по-прежнему верен для C, новый стандарт С++ (С++ 11) был изменен, поэтому это предупреждение больше не должно выдаваться при использовании С++ и компилятора С++ 11.
Из стандарта С++ 11 через сообщение Джеймса:
Исходный файл, который не является пустым и не заканчивается символом новой строки или заканчивается символом новой строки, которому предшествует символ обратной косой черты перед тем, как произойдет любое такое сращивание, обрабатывается, как если бы к файлу добавлен дополнительный символ новой строки (С++ 11 §2.2/1).
Ответ 2
Требование, чтобы каждый исходный файл заканчивался неэкспертированной новой строкой, был удален в С++ 11. В спецификации теперь говорится:
Исходный файл, который не является пустым и не заканчивается символом новой строки или заканчивается символом новой строки, которому предшествует символ обратной косой черты перед тем, как произойдет любое такое сращивание, обрабатывается, как если бы к файлу добавлен дополнительный символ новой строки (С++ 11 §2.2/1).
Соответствующий компилятор больше не должен выдавать это предупреждение (по крайней мере, не при компиляции в режиме С++ 11, если у компилятора есть режимы для разных изменений спецификации языка).
Ответ 3
С++ 03 Стандарт [2.1.1.2] объявляет:
... Если исходный файл, который не является пустым, не заканчивается символом новой строки или заканчивается символом новой строки сразу перед символом обратной косой черты перед любым таким сращиванием, поведение undefined.
Ответ 4
Ответ для "послушного" - "потому что в стандарте С++ 03 говорится, что поведение программы, не заканчивающееся в новой строке, - это undefined" (перефразировано).
Ответ для любопытного здесь: http://gcc.gnu.org/ml/gcc/2001-07/msg01120.html.
Ответ 5
Это не ссылка на пустую строку, то ли последняя строка (которая может содержать содержимое в ней) заканчивается новой строкой.
Большинство текстовых редакторов помещают новую строку в конце последней строки файла, поэтому, если в последней строке нет ее, существует риск, что файл был усечен. Однако есть веские причины, по которым вам может не понадобиться новая строка, поэтому это всего лишь предупреждение, а не ошибка.
Ответ 6
#include
заменит свою строку литеральным содержимым файла. Если файл не заканчивается символом новой строки, строка, содержащая #include
, которая втянула его, будет сливаться со следующей строкой.
Ответ 7
Я использую c-free IDE версии 5.0, в моей progrm либо из языка "С++", либо "c" я получал такую же проблему. Просто в конце программы, т.е. последняя строка программа (после фигурных скобок функции она может быть основной или любой функцией), нажмите клавишу ввода. будет увеличено на 1. Затем выполните ту же программу, она будет работать без ошибок.
Ответ 8
Конечно, на практике каждый компилятор добавляет новую строку после #include. К счастью. - @mxcl
не определенный C/С++, а диалект C: при использовании расширения GL_ARB_shading_language_include
компилятор glsl в OS X предупреждает вас о НЕ о недостающей строке новой строки. Таким образом, вы можете написать файл MyHeader.h
с защитой заголовка, который заканчивается на #endif // __MY_HEADER_H__
, и вы будете потерять строку после #include "MyHeader.h"
.
Ответ 9
Поскольку поведение отличается от версий C/С++, если файл не заканчивается новой строкой. Особенно противным является более старое С++ - версии, fx в С++ 03 стандарт говорит (фазы перевода):
Если исходный файл, который не является пустым, не заканчивается в новой строке символа или заканчивается символом новой строки, которому предшествует символ обратной косой черты, поведение undefined.
Undefined поведение плохое: стандартный совместимый компилятор может делать больше или меньше того, что он хочет здесь (вставить вредоносный код или что-то еще) - явно причина для предупреждения.
В то время как ситуация лучше в С++ 11, рекомендуется избегать ситуаций, когда поведение undefined в более ранних версиях. Спецификация С++ 03 хуже, чем C99, которая прямо запрещает такие файлы (поведение затем определяется).
Ответ 10
Это предупреждение также может помочь указать, что файл каким-либо образом был усечен. Верно, что компилятор, вероятно, все равно выбросит ошибку компилятора, особенно если он находится в середине функции, или, возможно, ошибка компоновщика, но они могут быть более загадочными и не гарантируются.
Конечно, это предупреждение также не гарантируется, если файл усечен сразу после новой строки, но он все равно может уловить некоторые случаи, которые могут быть пропущены другими ошибками, и дает более сильный намек на проблему.
Ответ 11
Это не здорово. Для меня я работаю в Dev С++ под Windows 7, имею такое же предупреждение.
Я просто поместил новую строку после моего кода (просто нажмите кнопку ввода), предупреждение исчезнет. Так или иначе
это не повлияет на запуск программы или компиляцию.
Ответ 12
Это не ошибка. Это просто предупреждение.
Откройте файл в редакторе, перейдите к последней строке файла и нажмите enter, чтобы добавить пустую строку в конец файла.
Хотя, кроме того, вы должны использовать #include <iostream>
вместо <iostream.h>
. Затем введите using std::cout;
после него.