Подумайте о некоторых проблемах, которые могут возникнуть при отсутствии новой строки. В соответствии со стандартом 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).
catфайл, и у него нет завершающего символа новой строки, так как новое приглашение оболочки появится после последней строки файла (т.е. не в столбце 0)