Предупреждение компилятора “No newline at end of file”
В чем причина следующего предупреждения в некоторых компиляторах на C ++?
Нет строки в конце файла
Почему у меня должна быть пустая строка в конце файла источника / заголовка?
- x86 Инструкция MUL от VS 2008/2010
- Можно ли отделить основную функцию и classы C ++ от подпрограмм Objective-C и / или C при компиляции и ссылке?
- Как был написан первый компилятор?
- Эквивалент загрузчиков classов в .NET.
- Что делает компилятор точно в срок (JIT)?
- Поиск 16-разрядного компилятора x86
- Как декомпилировать файл APK или DEX на платформе Android?
- Ошибка C #: родительский элемент не содержит конструктор, который принимает 0 аргументов
- sqrt из math.h вызывает ошибку компоновщика «неопределенная ссылка на sqrt» только тогда, когда аргумент не является константой
- объединить два GCC скомпилированных .o объектных файлов в третий файл .o
- Можно ли компилировать виды Razor?
- Почему я получаю «нестатистическую переменную, на которую нельзя ссылаться из статического контекста»?
- Как выглядит AST (абстрактное синтаксическое дерево) для объектно-ориентированного языка программирования?
Подумайте о некоторых проблемах, которые могут возникнуть, если нет новой строки. Согласно стандарту 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;
после этого.