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

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

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

Зачем мне пустую строку в конце файла источника/заголовка?

164
16 сент. '08 в 16:38
источник поделиться
12 ответов

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

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

Из стандарта С++ 11 через сообщение Джеймса:

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

194
16 сент. '08 в 16:49
источник

Связанные вопросы


Похожие вопросы

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

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

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

36
17 нояб. '11 в 21:30
источник

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

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

21
16 сент. '08 в 16:52
источник

Ответ для "послушного" - "потому что в стандарте С++ 03 говорится, что поведение программы, не заканчивающееся в новой строке, - это undefined" (перефразировано).

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

15
16 сент. '08 в 16:46
источник

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

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

6
16 сент. '08 в 16:40
источник

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

5
16 сент. '08 в 16:47
источник

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

2
11 дек. '12 в 12:47
источник

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

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

2
23 дек. '14 в 19:47
источник

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

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

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

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

1
06 авг. '15 в 11:43
источник

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

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

0
07 янв. '12 в 19:19
источник

Это не здорово. Для меня я работаю в Dev С++ под Windows 7, имею такое же предупреждение. Я просто поместил новую строку после моего кода (просто нажмите кнопку ввода), предупреждение исчезнет. Так или иначе это не повлияет на запуск программы или компиляцию.

Add a new line at last

-1
30 марта '14 в 16:06
источник

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

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

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

-3
21 июля '11 в 12:07
источник

Посмотрите другие вопросы по меткам или Задайте вопрос