Предупреждение компилятора «Нет новой строки в конце файла»

c++ compiler-construction warnings c-preprocessor

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 через сообщение Джеймса:

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

Автор: TJ Seabrooks Размещён: 16.09.2008 01:49

41 плюса

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

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

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

Автор: James McNellis Размещён: 17.11.2011 06:30

23 плюса

Стандарт 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:46

6 плюса

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

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

Автор: Leigh Caldwell Размещён: 16.09.2008 01:40

5 плюса

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

Автор: moonshadow Размещён: 16.09.2008 01:47

2 плюса

Я использую c-free IDE версии 5.0, в моей программе на языке «c ++» или «c» у меня возникла та же проблема. Просто в конце программы, т.е. в последней строке программы (после скобок функции это может быть основной или любой другой функции), нажмите enter- line no. будет увеличено на 1. затем выполнить ту же программу, она будет работать без ошибок.

Автор: divesh Размещён: 11.12.2012 09:47

2 плюса

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

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

Автор: Jan-Philip Loos Размещён: 23.12.2014 04:47

2 плюса

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

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

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

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

Автор: skyking Размещён: 06.08.2015 08:43

0 плюса

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

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

Автор: mwfearnley Размещён: 07.01.2012 04:19

-3 плюса

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

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

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

Автор: keya Размещён: 21.07.2011 09:07
Вопросы из категории :
32x32