Question

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?

Était-ce utile?

La solution

Pensez à certains des problèmes qui peuvent survenir s’il n’ya pas de nouvelle ligne. Selon la norme ANSI, le #include d'un fichier au début insère le fichier exactement tel qu'il est au début du fichier et n'insère pas la nouvelle ligne après le #include < foo.h > après le contenu du fichier. Donc, si vous incluez un fichier sans nouvelle ligne à la fin de l'analyseur, il sera vu comme si la dernière ligne de foo.h était 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? La première ligne de foo.cpp est maintenant commentée. Ce ne sont là que quelques exemples des types de problèmes qui peuvent surgir.

Je voulais simplement indiquer aux parties intéressées la réponse de James ci-dessous. Bien que la réponse ci-dessus soit toujours correcte pour le langage C, le nouveau standard C ++ (C ++ 11) a été modifié afin que cet avertissement ne soit plus émis si vous utilisez C ++ et un compilateur conforme à C ++ 11.

Du standard C ++ 11 via la publication 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'un caractère de barre oblique inversée avant qu'un tel épissage ne se produise, doit être traité comme s'il s'agissait d'un élément joint. des caractères de nouvelle ligne supplémentaires ont été ajoutés au fichier (C ++ 11 & # 167; 2.2 / 1).

Autres conseils

L'exigence selon laquelle chaque fichier source doit se terminer par une nouvelle ligne non échappée a été supprimée en C ++ 11. La spécification se lit maintenant 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'un caractère de barre oblique inversée avant qu'un tel épissage ne se produise, doit être traité comme s'il s'agissait d'un élément joint. des caractères de nouvelle ligne supplémentaires ont été ajoutés au fichier (C ++ 11 §2.2 / 1).

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

C ++ 03 Standard [2.1.1.2] déclare:

  

... Si un fichier source non vide ne se termine pas par un caractère de nouvelle ligne, ni par un caractère de nouvelle ligne   immédiatement précédé d'un caractère barre oblique inverse avant qu'un tel épissage ne se produise, le comportement n'est pas défini.

La réponse à la question "obéissant" est "parce que le standard C ++ 03 dit que le comportement d’un programme ne se terminant pas par une nouvelle ligne n’est pas défini" (paraphrasé).

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

Cela ne fait pas référence à une ligne vide, mais à la fin de la dernière ligne (qui peut contenir du contenu) se termine par une nouvelle ligne.

La plupart des éditeurs de texte placent une nouvelle ligne à la fin de la dernière ligne d'un fichier. Par conséquent, si la dernière ligne n'en contient pas, le fichier risque d'être tronqué. Cependant, il existe des raisons valables pour lesquelles vous ne souhaitez peut-être pas utiliser la nouvelle ligne. Il ne s'agit donc que d'un avertissement, pas d'une erreur.

#include remplacera sa ligne par le contenu littéral du fichier. Si le fichier ne se termine pas par un retour à la ligne, la ligne contenant le #include qui l'a extrait fusionnera avec la ligne suivante.

J'utilise la version 5.0 de C-free IDE, dans mon programme, soit du langage "c ++", soit du langage "c", le même problème.Juste à la fin du programme , c'est-à-dire la dernière ligne de le programme (après les accolades, il peut s'agir d'une fonction principale ou de n'importe quelle fonction), appuyez sur entrée -numéro de ligne. sera augmenté de 1.puis exécuter le même programme, il s'exécutera sans erreur.

  

Bien entendu, dans la pratique, chaque compilateur ajoute une nouvelle ligne après le #include. Heureusement. - @mxcl

pas un C / C ++ spécifique, mais un dialecte C: lorsque vous utilisez l'extension GL_ARB_shading_language_include , le compilateur glsl sous OS X vous avertit NOT de la nouvelle ligne manquante. Ainsi, vous pouvez écrire un fichier MyHeader.h avec un garde d'en-tête qui se termine par #endif // __MY_HEADER_H __ et vous perdrez la ligne après la #include "MyHeader.h" à coup sûr.

Parce que le comportement diffère entre les versions C / C ++ si le fichier ne se termine pas par new-line. Les versions C ++ les plus anciennes sont particulièrement désagréables. Par contre, le standard (phases de traduction) est le suivant: fx en C ++ 03:

  

Si un fichier source non vide ne se termine pas par une nouvelle ligne   caractère, ou se termine par un caractère de nouvelle ligne immédiatement précédé d'un   barre oblique inverse, le comportement n'est pas défini.

Un comportement indéfini est mauvais: un compilateur conforme standard peut faire plus ou moins ce qu’il veut ici (insérer du code malicieux ou autre) - un motif clair d’avertissement.

Bien que la situation soit meilleure en C ++ 11, il est judicieux d'éviter les situations où le comportement n'est pas défini dans les versions antérieures. La spécification C ++ 03 est pire que C99, qui interdit carrément de tels fichiers (le comportement est alors défini).

Cet avertissement peut également aider à indiquer qu'un fichier peut avoir été tronqué d'une manière ou d'une autre. Il est vrai que le compilateur générera probablement une erreur, en particulier si elle est au milieu d’une fonction, ou peut-être une erreur liée à l’éditeur de liens, mais elle pourrait être plus cryptique et ne devrait pas se produire.

Bien entendu, cet avertissement n’est pas garanti non plus si le fichier est tronqué immédiatement après une nouvelle ligne, mais il peut néanmoins détecter certains cas que d’autres erreurs pourraient manquer et donner une indication plus précise du problème.

Ce n'est pas une erreur. C'est juste un avertissement.

Ouvrez le fichier dans un éditeur, allez à la dernière ligne du fichier et appuyez sur Entrée pour ajouter une ligne vierge à la fin du fichier.

Toutefois, vous devriez également utiliser #include < iostream > au lieu de < iostream.h > . Puis insérez un en utilisant std :: cout; après.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top