194 votes

Avertissement du compilateur "Pas de nouvelle ligne à la fin du fichier".

Quelle est la raison de l'avertissement suivant dans certains compilateurs C++ ?

Pas de nouvelle ligne à la fin du fichier

Pourquoi devrais-je avoir une ligne vide à la fin d'un fichier source/en-tête ?

223voto

Thomas Points 6891

Pensez à certains des problèmes qui peuvent survenir s'il n'y a pas de nouvelle ligne. Selon la norme ANSI, le #include d'un fichier au début insère le fichier exactement comme il est au début du fichier et n'insère pas la nouvelle ligne après le "#include" après le contenu du fichier. Ainsi, si vous incluez un fichier sans nouvelle ligne à la fin, l'analyseur syntaxique considérera que la dernière ligne de foo.h est sur la même ligne que la première ligne de foo.cpp. Et si la dernière ligne de foo.h était un commentaire sans nouvelle ligne ? Maintenant, la première ligne de foo.cpp est commentée. Ce ne sont là que quelques exemples du type de problèmes qui peuvent surgir.

Modifier : Je voulais juste indiquer à toutes les parties intéressées la réponse de James ci-dessous. Bien que la réponse ci-dessus soit toujours correcte pour le C, le nouveau standard C++ (C++11) a été modifié de sorte que cet avertissement ne devrait plus être émis si vous utilisez C++ et un compilateur conforme à C++11.

Extrait de la norme C++11 via le post de James :

Un fichier source qui n'est pas vide et qui ne se termine pas par un caractère de nouvelle ligne, ou qui se termine par un caractère de nouvelle ligne immédiatement précédé d'une barre oblique inversée avant qu'un tel épissage n'ait lieu, sera traité comme si un caractère de nouvelle ligne supplémentaire était ajouté au fichier (C++11 §2.2/1).

47voto

James McNellis Points 193607

L'exigence selon laquelle chaque fichier source doit se terminer par une nouvelle ligne non échappée a été supprimée dans C++11. La spécification se lit désormais comme suit :

Un fichier source qui n'est pas vide et qui ne se termine pas par un caractère de nouvelle ligne, ou qui se termine par un caractère de nouvelle ligne immédiatement précédé d'une barre oblique inversée avant qu'un tel épissage n'ait lieu, sera traité comme si un caractère de nouvelle ligne supplémentaire était ajouté au fichier (C++11 §2.2/1).

Un compilateur conforme ne devrait plus émettre cet avertissement (du moins pas lors de la compilation en mode C++11, si le compilateur possède des modes pour différentes révisions de la spécification du langage).

28voto

Igor Semenov Points 1232

La norme C++ [2.1.1.2] déclare :

... Si un fichier source qui n'est pas vide ne se termine pas par un caractère de nouvelle ligne, ou se termine par un caractère de nouvelle ligne immédiatement précédé d'une barre oblique inversée avant qu'un tel épissage n'ait lieu, le comportement est indéfini.

16voto

La réponse pour les "obéissants" est "parce que la norme dit que le comportement d'un programme ne se terminant pas par une nouvelle ligne est indéfini" (paraphrasé).

La réponse pour les curieux est ici : http://gcc.gnu.org/ml/gcc/2001-07/msg01120.html .

6voto

Leigh Caldwell Points 4176

Il ne s'agit pas d'une ligne vide, mais de savoir si la dernière ligne (qui peut contenir du contenu) est terminée par une nouvelle ligne.

La plupart des éditeurs de texte mettent un saut de ligne à la fin de la dernière ligne d'un fichier. Si la dernière ligne n'en a pas, le fichier risque d'être tronqué. Cependant, il y a des raisons valables pour lesquelles vous ne voulez pas de saut de ligne. Il s'agit donc d'un avertissement et non d'une erreur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X