Предупреждение компилятора "Нет новой строки в конце файла"
В чем причина следующего предупреждения в некоторых компиляторах C++?
Нет новой строки в конце файла
Почему у меня должна быть пустая строка в конце файла источника / заголовка?
12 ответов
Подумайте о некоторых проблемах, которые могут возникнуть при отсутствии новой строки. Согласно стандарту ANSI #include
файла в начале вставляет файл точно так, как он находится в начале файла и не вставляет новую строку после #include <foo.h>
после содержимого файла. Таким образом, если вы добавите в парсер файл без перевода строки в конце, он будет выглядеть так, как будто последняя строка 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
который вытащил его, сольется со следующей строкой.
Конечно, на практике каждый компилятор добавляет новую строку после #include. К счастью. - @mxcl
не конкретный C/C++, а диалект C: при использовании GL_ARB_shading_language_include
расширение компилятора glsl на OS X предупреждает вас НЕ о пропущенном переводе строки. Таким образом, вы можете написать MyHeader.h
файл с защитой заголовка, который заканчивается #endif // __MY_HEADER_H__
и вы потеряете линию после #include "MyHeader.h"
наверняка.
Я использую c-free IDE версии 5.0, в моей программе на языке "C++" или "c" у меня возникла та же проблема. Просто в конце программы, т.е. в последней строке программы (после скобок функции это может быть основной или любой другой функции),нажмите enter- line no. будет увеличен на 1. затем выполнить ту же программу, она будет работать без ошибок.
Потому что поведение отличается в версиях C/C++, если файл не заканчивается новой строкой. Особенно неприятны старые C++ - версии, fx в C++ 03 стандарт говорит (фазы перевода):
Если исходный файл, который не является пустым, не заканчивается символом новой строки или заканчивается символом новой строки, которому непосредственно предшествует символ обратной косой черты, поведение не определено.
Неопределенное поведение - это плохо: стандартный компилятор, отвечающий требованиям, может делать более или менее то, что он хочет здесь (вставлять вредоносный код или что-то еще) - явно причина для предупреждения.
Хотя в C++11 ситуация лучше, рекомендуется избегать ситуаций, когда поведение не определено в более ранних версиях. Спецификация C++ 03 хуже, чем C99, которая категорически запрещает такие файлы (затем определяется поведение).
В моем случае я использую язык KOTLIN и компилятор на IntelliJ. Кроме того, я использую контейнер докеров с LINT для исправления возможных проблем с опечатками, импортом, использованием кода и т. д. Эта ошибка возникает из-за этих исправлений lint, скорее всего — я имею в виду, конечно.
Короче говоря, ошибка говорит: «Добавить новую строку в конец файла». Вот и все.
Раньше НЕ БЫЛО лишней пустой строки:
Это предупреждение может также помочь указать, что файл мог быть как-то урезан. Это правда, что компилятор, вероятно, все равно выдаст ошибку компилятора - особенно, если она находится в середине функции - или, возможно, ошибку компоновщика, но они могут быть более загадочными и не гарантированно произойдут.
Конечно, это предупреждение также не гарантируется, если файл обрезается сразу после новой строки, но оно все равно может отлавливать некоторые случаи, которые могут пропустить другие ошибки, и дает более сильный намек на проблему.
Это не ошибка. Это просто предупреждение.
Откройте файл в редакторе, перейдите к последней строке файла и нажмите клавишу ввода, чтобы добавить пустую строку в конец файла.
Хотя, кроме того, вы должны использовать #include <iostream>
вместо <iostream.h>
, Затем положить в using std::cout;
после этого.