Qual é o motivo do seguinte aviso em alguns compiladores C ++?
Nenhuma nova linha no final do arquivo
Por que eu deveria ter uma linha vazia no final de um arquivo de origem / cabeçalho?
c++
compiler-construction
warnings
c-preprocessor
Brian Tompsett - 汤 莱恩
fonte
fonte
cat
um arquivo e ele não tem uma nova linha de fuga como o novo shell prompt aparecerá após a última linha do arquivo (ou seja, não na coluna 0)Why should I have an empty line at the end of a source/header file
- Se um arquivo de texto contémone\ntwo\nthree\n
, ele contém três linhas, nenhuma das quais está vazia. Se um arquivo de texto contiverone\ntwo\nthree
, ele não será um arquivo de texto, no mesmo sentido em que uma sentença sem ponto final no final não é uma sentença.Respostas:
Pense em alguns dos problemas que podem ocorrer se não houver 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#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á exibido como se a última linha de estivessefoo.h
na mesma linha que a primeira linha defoo.cpp
. E se a última linha de foo.h fosse um comentário sem uma nova linha? Agora, a primeira linha defoo.cpp
é comentada. Estes são apenas alguns exemplos dos tipos de problemas que podem surgir.Só queria apontar as partes interessadas para 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 esse aviso não seja mais emitido se você estiver usando C ++ e um compilador em conformidade com C ++ 11.
Do padrão C ++ 11 via postagem de James:
fonte
O requisito de que todo arquivo de origem termine com uma nova linha não escapada foi removido no C ++ 11. A especificação agora diz:
Um compilador em conformidade não deve mais emitir esse 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).
fonte
O padrão C ++ 03 [2.1.1.2] declara:
fonte
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 .
fonte
Não se refere a uma linha em branco, é se a última linha (que pode conter conteúdo) é finalizada 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.
fonte
#include
substituirá sua linha pelo conteúdo literal do arquivo. Se o arquivo não terminar com uma nova linha, a linha contendo a#include
que o puxou entrará na próxima linha.fonte
Eu estou usando c-livre IDE versão 5.0, na minha progrm qualquer um 'c ++' ou 'c' linguagem i estava ficando mesmo problem.Just no final do programa ou seja, última linha do programa (após chaves de função pode ser principal ou qualquer função), pressione enter - line no. será aumentado em 1.; em seguida, execute o mesmo programa, ele será executado sem erros.
fonte
C / C ++ não específico, mas um dialeto C: ao usar a
GL_ARB_shading_language_include
extensão, o compilador glsl no OS X avisa NÃO sobre uma nova linha ausente. Então você pode escrever umMyHeader.h
arquivo com um guarda cabeçalho que termina com#endif // __MY_HEADER_H__
e você vai perder a linha após a#include "MyHeader.h"
certeza.fonte
Porque o comportamento difere entre as versões C / C ++ se o arquivo não terminar com nova linha. Especialmente desagradável é as versões C ++ mais antigas, fx em C ++ 03, o padrão diz (fases de tradução):
O comportamento indefinido é ruim: um compilador em conformidade padrão pode fazer mais ou menos o que deseja aqui (inserir código malicioso ou o que for) - claramente um motivo para aviso.
Embora a situação seja melhor no C ++ 11, é uma boa ideia evitar situações em que o comportamento é indefinido nas versões anteriores. A especificação C ++ 03 é pior que a C99, que proíbe completamente esses arquivos (o comportamento é então definido).
fonte
#include
diretiva , e alguns programadores direcionados a esses compiladores podem ter explorado esse comportamento. Se o Padrão deixar essas coisas como Indefinidas, os programas que exploram essas peculiaridades serão bem definidos em plataformas que especificam esse comportamento. Ter o Padrão como um comportamento quebraria esses programas.Esse aviso também pode ajudar a indicar que um arquivo pode ter sido truncado de alguma forma. É verdade que o compilador provavelmente lançará um erro do compilador de qualquer maneira - especialmente se estiver no meio de uma função - ou talvez um erro do vinculador, mas estes podem ser mais enigmáticos e não são garantidos.
É claro que esse aviso também não é garantido se o arquivo for truncado imediatamente após uma nova linha, mas ainda assim pode ser detectado alguns casos em que outros erros podem falhar e fornece uma dica mais forte para o problema.
fonte
Isso não é um erro. É apenas um aviso.
Abra o arquivo em um editor, vá para a última linha do arquivo e pressione Enter para adicionar uma linha em branco ao final do arquivo.
Embora, além disso, você deva estar usando em
#include <iostream>
vez de<iostream.h>
. Em seguida, coloque umusing std::cout;
depois dele.fonte