Pergunta

Qual é o motivo do seguinte aviso em alguns compiladores C++?

Nenhuma nova linha no final do arquivo

Por que devo ter uma linha vazia no final de um arquivo de origem/cabeçalho?

Foi útil?

Solução

Pense em alguns dos problemas que podem ocorrer se não houver uma nova linha.De acordo com o padrão ANSI o #include de um arquivo no início insere o arquivo exatamente como está na frente do arquivo e não insere a nova linha após o #include <foo.h> após o conteúdo do arquivo.Portanto, se você incluir um arquivo sem nova linha no final do analisador, ele será visto como se a última linha do foo.h está na mesma linha que a primeira linha de foo.cpp.E se a última linha de foo.h fosse um comentário sem uma nova linha?Agora a primeira linha de foo.cpp está comentado.Estes são apenas alguns exemplos dos tipos de problemas que podem surgir.


Só queria indicar às partes interessadas a resposta de James abaixo.Embora a resposta acima ainda esteja correta para C, o novo padrão C++ (C++ 11) foi alterado para que este aviso não deva mais ser emitido se estiver usando C++ e um compilador em conformidade com C++ 11.

Do padrão C++ 11 através da postagem de James:

Um arquivo de origem que não esteja vazio e que não termine com um caractere de nova linha, ou que termine com um caractere de nova linha imediatamente precedido por um caractere de barra invertida antes de qualquer emenda ocorrer, deverá ser processado como se fosse um caractere de nova linha adicional. caractere de linha foram anexados ao arquivo (C++ 11 §2.2/1).

Outras dicas

O requisito de que cada arquivo de origem termine com uma nova linha sem escape foi removido no C++ 11.A especificação agora diz:

Um arquivo de origem que não esteja vazio e que não termine com um caractere de nova linha, ou que termine com um caractere de nova linha imediatamente precedido por um caractere de barra invertida antes de qualquer emenda ocorrer, deverá ser processado como se fosse um caractere de nova linha adicional. caractere de linha foram anexados ao arquivo (C++ 11 §2.2/1).

Um compilador em conformidade não deve mais emitir este aviso (pelo menos não ao compilar no modo C++11, se o compilador tiver modos para diferentes revisões da especificação da linguagem).

O padrão C++ 03 [2.1.1.2] declara:

...Se um arquivo de origem que não estiver vazio não termina em um caractere de nova linha ou termina em um caractere de nova linha precedido imediatamente por um caractere de barra de barragem antes que qualquer splicing ocorra, o comportamento é indefinido.

A resposta para o "obediente" é "porque o padrão C++ 03 diz que o comportamento de um programa que não termina em nova linha é indefinido" (parafraseado).

A resposta para os curiosos está aqui: http://gcc.gnu.org/ml/gcc/2001-07/msg01120.html.

Não se refere a uma linha em branco, mas sim se a última linha (que pode conter conteúdo) termina com uma nova linha.

A maioria dos editores de texto colocará uma nova linha no final da última linha de um arquivo, portanto, se a última linha não tiver uma, existe o risco de o arquivo ter sido truncado.No entanto, existem razões válidas pelas quais você pode não querer a nova linha, portanto é apenas um aviso, não um erro.

#include substituirá sua linha pelo conteúdo literal do arquivo.Se o arquivo não terminar com uma nova linha, a linha que contém o #include que o puxou será mesclado com a próxima linha.

Estou usando o IDE c-free versão 5.0, em meu programa de linguagem 'c++' ou 'c' eu estava tendo o mesmo problema. no final do programa ou sejaúltima linha do programa (depois dos colchetes da função pode ser principal ou qualquer função),pressione Enter-linha não.será aumentado em 1. em seguida, execute o mesmo programa, ele será executado sem erros.

É claro que na prática todo compilador adiciona uma nova linha após #include.Agradecidamente.– @mxcl

não C/C++ específico, mas um dialeto C:ao usar o GL_ARB_shading_language_include extensão o compilador glsl no OS X avisa você NÃO sobre uma nova linha ausente.Então você pode escrever um MyHeader.h arquivo com um protetor de cabeçalho que termina com #endif // __MY_HEADER_H__ e você vai perder a linha depois do #include "MyHeader.h" claro que sim.

Porque o comportamento difere entre as versões C/C++ se o arquivo não terminar com nova linha.Especialmente desagradáveis ​​são as versões C++ mais antigas, fx em C++ 03 o padrão diz (fases de tradução):

Se um arquivo de origem que não estiver vazio não termina em um caractere de nova linha ou termina em um caractere de nova linha precedido imediatamente por um caractere de barra de barra, o comportamento é indefinido.

Comportamento indefinido é ruim:um compilador em conformidade com o padrão poderia fazer mais ou menos o que deseja aqui (inserir código malicioso ou qualquer outra coisa) - claramente um motivo para aviso.

Embora a situação seja melhor no C++ 11, é uma boa ideia evitar situações em que o comportamento seja indefinido em versões anteriores.A especificação C++03 é pior que C99, que proíbe totalmente tais arquivos (o comportamento é então definido).

Este aviso também pode ajudar a indicar que um arquivo pode ter sido truncado de alguma forma.É verdade que o compilador provavelmente gerará um erro de compilador de qualquer maneira - especialmente se estiver no meio de uma função - ou talvez um erro de vinculador, mas estes podem ser mais enigmáticos e não há garantia de ocorrência.

É claro que este aviso também não é garantido se o arquivo for truncado imediatamente após uma nova linha, mas ainda pode detectar alguns casos que outros erros podem perder e fornecer uma dica mais forte sobre o problema.

Isso não é um erro.É apenas um aviso.

Abra o arquivo em um editor, vá até a última linha do arquivo e pressione Enter para adicionar uma linha em branco ao final do arquivo.

Embora, além disso, você deva usar #include <iostream> em vez de <iostream.h>.Depois coloque um using std::cout; depois disso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top