Предупреждение компилятора «Нет новой строки в конце файла»
82285 просмотра
11 ответа
В чем причина следующего предупреждения в некоторых компиляторах C ++?
Нет новой строки в конце файла
Почему у меня должна быть пустая строка в конце файла источника / заголовка?
Источник Размещён: 17.05.2019 02:37Ответы (11)
204 плюса
Подумайте о некоторых проблемах, которые могут возникнуть при отсутствии новой строки. В соответствии со стандартом ANSI #include
файл в начале вставляет файл в точности так, как он находится в начале файла, и не вставляет новую строку #include <foo.h>
после содержимого файла после. Поэтому, если вы добавите в парсер файл без новой строки в конце, он будет выглядеть так, как если бы последняя строка была foo.h
на той же строке, что и первая строка foo.cpp
. Что если в последней строке foo.h был комментарий без новой строки? Теперь первая строка foo.cpp
закомментирована. Это всего лишь пара примеров типов проблем, которые могут возникнуть.
Просто хотел указать любым заинтересованным сторонам на ответ Джеймса ниже. Хотя приведенный выше ответ все еще корректен для C, новый стандарт C ++ (C ++ 11) был изменен, так что это предупреждение больше не должно появляться, если используется C ++ и компилятор, соответствующий C ++ 11.
Из стандарта C ++ 11 через сообщение Джеймса:
Автор: TJ Seabrooks Размещён: 16.09.2008 01:49Исходный файл, который не является пустым и не заканчивается символом новой строки или заканчивается символом новой строки, которому непосредственно предшествует символ обратной косой черты, до того, как произойдет любое такое объединение, должен обрабатываться так, как если бы дополнительный новый символ строки был добавлен к файлу (C ++ 11 §2.2 / 1).
41 плюса
Требование, чтобы каждый исходный файл заканчивался не экранированным символом новой строки, было удалено в C ++ 11. Спецификация теперь гласит:
Исходный файл, который не является пустым и не заканчивается символом новой строки или заканчивается символом новой строки, которому непосредственно предшествует символ обратной косой черты, до того, как произойдет любое такое объединение, должен обрабатываться так, как если бы дополнительный новый символ строки был добавлен к файлу (C ++ 11 §2.2 / 1).
Соответствующий компилятор больше не должен выдавать это предупреждение (по крайней мере, при компиляции в режиме C ++ 11, если у компилятора есть режимы для разных ревизий спецификации языка).
Автор: James McNellis Размещён: 17.11.2011 06:3023 плюса
Стандарт C ++ 03 [2.1.1.2] объявляет:
Автор: Igor Semenov Размещён: 16.09.2008 01:52... Если исходный файл, который не является пустым, не заканчивается символом новой строки или заканчивается символом новой строки, которому непосредственно предшествует символ обратной косой черты, прежде чем произойдет любое такое объединение, поведение не определено.
15 плюса
Ответ для «послушного» - «потому что стандарт C ++ 03 говорит, что поведение программы, не заканчивающейся переводом строки, не определено» (перефразировано).
Ответ для любопытных находится здесь: http://gcc.gnu.org/ml/gcc/2001-07/msg01120.html .
Автор: Vytautas Shaltenis Размещён: 16.09.2008 01:466 плюса
Это не относится к пустой строке, а заканчивается ли последняя строка (которая может содержать содержимое) новой строкой.
Большинство текстовых редакторов помещают новую строку в конец последней строки файла, поэтому, если в последней строке ее нет, существует риск, что файл был усечен. Тем не менее, существуют веские причины, по которым вам может не понадобиться перевод строки, поэтому это всего лишь предупреждение, а не ошибка.
Автор: Leigh Caldwell Размещён: 16.09.2008 01:405 плюса
#include
заменит свою строку на буквальное содержимое файла. Если файл не заканчивается новой строкой, строка, содержащая #include
его, объединится со следующей строкой.
2 плюса
Я использую c-free IDE версии 5.0, в моей программе на языке «c ++» или «c» у меня возникла та же проблема. Просто в конце программы, т.е. в последней строке программы (после скобок функции это может быть основной или любой другой функции), нажмите enter- line no. будет увеличено на 1. затем выполнить ту же программу, она будет работать без ошибок.
Автор: divesh Размещён: 11.12.2012 09:472 плюса
Конечно, на практике каждый компилятор добавляет новую строку после #include. К счастью. - @mxcl
не специфический C / C ++, а диалект C: при использовании GL_ARB_shading_language_include
расширения компилятор glsl в OS X предупреждает вас НЕ о пропущенном переводе строки. Таким образом, вы можете написать MyHeader.h
файл с заголовком, который заканчивается на, #endif // __MY_HEADER_H__
и вы наверняка потеряете строку после #include "MyHeader.h"
.
2 плюса
Потому что поведение отличается в версиях C / C ++, если файл не заканчивается новой строкой. Особенно неприятны старые C ++ - версии, fx в C ++ 03 стандарт говорит (фазы перевода):
Если исходный файл, который не является пустым, не заканчивается символом новой строки или заканчивается символом новой строки, которому непосредственно предшествует символ обратной косой черты, поведение не определено.
Неопределенное поведение - это плохо: стандартный компилятор, отвечающий требованиям, может делать более или менее то, что он хочет здесь (вставлять вредоносный код или что-то еще) - явно причина для предупреждения
Хотя в C ++ 11 ситуация лучше, рекомендуется избегать ситуаций, когда поведение не определено в более ранних версиях. Спецификация C ++ 03 хуже, чем C99, которая категорически запрещает такие файлы (затем определяется поведение).
Автор: skyking Размещён: 06.08.2015 08:430 плюса
Это предупреждение может также помочь указать, что файл мог быть как-то урезан. Это правда, что компилятор, вероятно, все равно выдаст ошибку компилятора - особенно если она находится в середине функции - или, возможно, ошибку компоновщика, но они могут быть более загадочными и не гарантированно произойдут.
Конечно, это предупреждение также не гарантируется, если файл обрезается сразу после новой строки, но оно все равно может отлавливать некоторые случаи, которые могут пропустить другие ошибки, и дает более сильный намек на проблему.
Автор: mwfearnley Размещён: 07.01.2012 04:19-3 плюса
Это не ошибка. Это просто предупреждение.
Откройте файл в редакторе, перейдите к последней строке файла и нажмите клавишу ввода, чтобы добавить пустую строку в конец файла.
Хотя, кроме того, вы должны использовать #include <iostream>
вместо <iostream.h>
. Тогда вставьте using std::cout;
после этого.
Вопросы из категории :
- c++ What are the barriers to understanding pointers and what can be done to overcome them?
- c++ Какой самый простой способ для анализа файла INI в C ++?
- c++ Когда вы должны использовать «друг» в C ++?
- c++ Как вы очищаете переменную stringstream?
- c++ В C ++ конструктор и деструктор могут быть встроенными функциями?
- compiler-construction Предупреждение компилятора «Нет новой строки в конце файла»
- compiler-construction Где хранятся статические переменные в C и C ++?
- compiler-construction C компилятором для Windows?
- compiler-construction Как настроить общий ccache
- compiler-construction Написание компилятора на своем родном языке
- warnings Предупреждение. Обнаружены конфликты между разными версиями одной и той же зависимой сборки.
- warnings Что заставляет javac выдавать предупреждение «использует непроверенные или небезопасные операции»
- warnings Как я могу обработать предупреждение функции file_get_contents () в PHP?
- warnings Как я обращаюсь к непроверенным предупреждениям броска?
- c-preprocessor В чем разница между #include <filename> и #include "filename"?
- c-preprocessor Как проверить ОС с помощью директивы препроцессора?
- c-preprocessor Зачем использовать явно бессмысленные операторы do-while и if-else в макросах?
- c-preprocessor Как сделать символьную строку из значения макроса C?