В чем причина следующего предупреждения в некоторых компиляторах C ++?
Нет новой строки в конце файла
Почему у меня должна быть пустая строка в конце файла источника / заголовка?
c++
compiler-construction
warnings
c-preprocessor
Брайан Томпсетт - 汤 莱恩
источник
источник
cat
файл, и у него нет завершающего символа новой строки, так как новое приглашение оболочки появится после последней строки файла (т.е. не в столбце 0)Why should I have an empty line at the end of a source/header file
- Если текстовый файл содержит,one\ntwo\nthree\n
то он содержит три строки, ни одна из которых не является пустой. Если текстовый файл содержит,one\ntwo\nthree
то это не текстовый файл, в том смысле, что предложение без полной остановки в конце не является предложением.Ответы:
Подумайте о некоторых проблемах, которые могут возникнуть при отсутствии новой строки. В соответствии со стандартом ANSI
#include
файл в начале вставляет файл точно так, как он находится в начале файла, и не вставляет новую строку#include <foo.h>
после содержимого файла после. Поэтому, если вы добавите в парсер файл без перевода строки в конце, он будет выглядеть так, как будто последняя строкаfoo.h
находится на той же строке, что и первая строкаfoo.cpp
. Что если в последней строке foo.h был комментарий без новой строки? Теперь первая строкаfoo.cpp
закомментирована. Это всего лишь пара примеров типов проблем, которые могут возникнуть.Просто хотел указать любым заинтересованным сторонам на ответ Джеймса ниже. Хотя приведенный выше ответ все еще корректен для C, новый стандарт C ++ (C ++ 11) был изменен, так что это предупреждение больше не должно появляться, если используется C ++ и компилятор, соответствующий C ++ 11.
Из стандарта C ++ 11 через сообщение Джеймса:
источник
Требование, чтобы каждый исходный файл заканчивался не экранированным символом новой строки, было удалено в C ++ 11. Спецификация теперь гласит:
Соответствующий компилятор больше не должен выдавать это предупреждение (по крайней мере, при компиляции в режиме 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. затем выполнить ту же программу, она будет работать без ошибок.
источник
не конкретный 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, которая категорически запрещает такие файлы (затем определяется поведение).
источник
#include
директивы и некоторые программисты, нацеленные на такие компиляторы, могли использовать такое поведение. Если в стандарте оставить такие вещи неопределенными, это позволит программам, использующим такие причуды, быть четко определенными на платформах, которые определяют такое поведение. При наличии стандартного мандата поведение нарушит такие программы.Это предупреждение может также помочь указать, что файл мог быть как-то урезан. Это правда, что компилятор, вероятно, все равно выдаст ошибку компилятора - особенно если он находится в середине функции - или, возможно, ошибку компоновщика, но они могут быть более загадочными и не гарантированно произойдут.
Конечно, это предупреждение также не гарантируется, если файл обрезается сразу после новой строки, но оно все равно может отлавливать некоторые случаи, которые могут пропустить другие ошибки, и дает более сильный намек на проблему.
источник
Это не ошибка. Это просто предупреждение.
Откройте файл в редакторе, перейдите к последней строке файла и нажмите клавишу ввода, чтобы добавить пустую строку в конец файла.
Хотя, кроме того, вы должны использовать
#include <iostream>
вместо<iostream.h>
. Тогда вставьтеusing std::cout;
после этого.источник