[C++] Pourquoi ce programme est-il rejeté par erreur par trois compilateurs C ++?


Answers

Originaire de Overv @ reddit .

Question

J'ai de la difficulté à compiler un programme C ++ que j'ai écrit.

Ce programme est très simple et, à ma connaissance, conforme à toutes les règles énoncées dans la norme C ++. J'ai lu l'intégralité de l'ISO / IEC 14882: 2003 à deux reprises pour être sûr.

Le programme est le suivant:

Voici la sortie que j'ai reçue en essayant de compiler ce programme avec Visual C ++ 2010:

c:\dev>cl /nologo helloworld.png
cl : Command line warning D9024 : unrecognized source file type 'helloworld.png', object file assumed
helloworld.png : fatal error LNK1107: invalid or corrupt file: cannot read at 0x5172

Consterné, j'ai essayé g ++ 4.5.2, mais c'était aussi inutile:

c:\dev>g++ helloworld.png
helloworld.png: file not recognized: File format not recognized
collect2: ld returned 1 exit status

Je pensais que Clang (version 3.0 tronc 127530) doit fonctionner, car il est très apprécié pour sa conformité aux normes. Malheureusement, il ne m'a même pas donné un de ses jolis messages d'erreur en surbrillance:

c:\dev>clang++ helloworld.png
helloworld.png: file not recognized: File format not recognized
collect2: ld returned 1 exit status
clang++: error: linker (via gcc) command failed with exit code 1 (use -v to see invocation)

Pour être honnête, je ne sais pas vraiment ce que signifient ces messages d'erreur.

Beaucoup d'autres programmes C ++ ont des fichiers source avec une extension .cpp , donc j'ai pensé que je devais peut-être renommer mon fichier. J'ai changé son nom pour helloworld.cpp , mais cela n'a pas aidé. Je pense qu'il y a un bogue très sérieux dans Clang parce que quand j'ai essayé de l'utiliser pour compiler le programme renommé, il a flippé, imprimé "84 avertissements et 20 erreurs générées". et a fait beaucoup de bruit à mon ordinateur!

Qu'ai-je fait de mal ici? Ai-je manqué une partie critique de la norme C ++? Ou les trois compilateurs sont-ils vraiment si cassés qu'ils ne peuvent pas compiler ce programme simple?




Suis-je le seul à ne pas reconnaître le caractère entre «retour» et le point-virgule? Ça pourrait être ça!




Essayez de changer l'interface d'entrée. C ++ s'attend à ce qu'un clavier soit branché à votre ordinateur, pas à un scanner. Il peut y avoir des problèmes de conflits de périphériques ici. Je n'ai pas vérifié la norme ISO si l'interface d'entrée au clavier est obligatoire, mais cela est vrai pour tous les compilateurs que j'ai déjà utilisés. Mais peut-être que l'entrée scanner est maintenant disponible en C99, et dans ce cas, votre programme devrait fonctionner. Sinon, vous devrez attendre la prochaine version standard et la mise à niveau des compilateurs.




Le premier problème est que vous essayez de renvoyer une valeur incorrecte à la fin de la fonction principale. La norme C ++ dicte que le type de retour de main () est int, mais que vous essayez de retourner l'ensemble vide.

L'autre problème est - au moins avec g ++ - que le compilateur déduit la langue utilisée du suffixe du fichier. De g ++ (1):

Pour tout fichier d'entrée donné, le suffixe du nom de fichier détermine le type de compilation effectué:

fichier.cc fichier.cp fichier.cxx fichier.cpp fichier.CPP fichier.c ++ fichier.C

Code source C ++ qui doit être prétraité. Notez que dans .cxx, les deux dernières lettres doivent être littéralement x. De même, .C se réfère à une capitale littérale C.

La fixation de ceux-ci devrait vous laisser avec une application entièrement fonctionnelle Hello World, comme on peut le voir sur la démo here .




Avez-vous écrit le programme à la main et l'avez-vous scanné dans l'ordinateur? C'est ce que laisse entendre "helloworld.png". Si tel est le cas, vous devez être conscient que le standard C ++ (même dans sa dernière édition) ne nécessite pas la présence de reconnaissance de caractères optiques, et malheureusement il n'est pas inclus en tant que fonctionnalité optionnelle dans les compilateurs actuels.

Vous pouvez envisager de transposer les graphiques dans un format textuel. Tout éditeur de texte brut peut être utilisé; l'utilisation d'un traitement de texte, bien que capable de générer un joli imprimé, entraînera très probablement la même erreur que vous obtenez en essayant de numériser.

Si vous êtes vraiment aventureux, vous pouvez essayer d'écrire votre code dans un traitement de texte. Imprimez-le, de préférence en utilisant une police comme OCR-A . Ensuite, prenez votre impression et scannez-la. L'analyse peut ensuite être exécutée via un package OCR tiers pour générer un formulaire texte. Le formulaire de texte peut ensuite être compilé en utilisant l'un des nombreux compilateurs standard.

Attention cependant au coût élevé du papier que cela entraînera pendant la phase de débogage.




Vous avez oublié d'utiliser Comic Sans comme police, c'est pourquoi son erreur.




Ce programme est valide - Je ne trouve aucune erreur.

Je suppose que vous avez un virus sur votre machine. Il serait préférable de reformater votre disque et de réinstaller le système d'exploitation.

Faites-nous savoir comment cela fonctionne, ou si vous avez besoin d'aide pour la réinstaller.

Je déteste les virus.




Essaye celui-là:




Vos compilateurs attendent ASCII , mais ce programme est évidemment écrit en utilisant EBCDIC .




helloworld.png: fichier non reconnu: format de fichier non reconnu

Évidemment, vous devriez formater votre disque dur.

Vraiment, ces erreurs ne sont pas si difficiles à lire.




File format not recognized Vous devez formater correctement votre fichier. Cela signifie utiliser les bonnes couleurs et polices pour votre code. Voir les documentations spécifiques pour chaque compilateur car ces couleurs varient entre les compilateurs;)




Il semble que votre compilateur ne supporte pas les fichiers dans un tel encodage hmm .... Essayez de le convertir en ASCII.




Vos < et > , ( et ) , { et } ne semblent pas très bien correspondre; Essayez de les dessiner mieux.




Vous devez spécifier la précision de votre sortie précédée d'un deux - points immédiatement avant l'accolade de fermeture finale . Puisque la sortie n'est pas numérique, la précision est zéro, vous avez donc besoin de ceci ...

: 0}




Malheureusement, vous avez sélectionné trois compilateurs qui prennent tous en charge plusieurs langues, pas seulement C ++. Ils doivent tous deviner le langage de programmation que vous avez utilisé. Comme vous le savez probablement déjà, le format PNG est adapté à tous les langages de programmation, pas seulement C ++.

Habituellement, le compilateur peut comprendre la langue elle-même. Par exemple, si le PNG est évidemment dessiné avec des crayons, le compilateur saura qu'il contient Visual Basic. Si on dirait qu'il est dessiné avec un crayon mécanique, il est facile de reconnaître l'ingénieur au travail, en écrivant le code FORTRAN.

Cette deuxième étape n'aide pas non plus le compilateur, dans ce cas. C et C ++ semblent juste trop similaires, jusqu'à #include . Par conséquent, vous devez aider le compilateur à décider quelle langue il est vraiment. Maintenant, vous pouvez utiliser des moyens non standard. Par exemple, le compilateur Visual Studio accepte les arguments de ligne de commande / TC et TP , ou vous pouvez utiliser l'option "Compiler en tant que: C ++" dans le fichier de projet. GCC et CLang ont leurs propres mécanismes, que je ne connais pas.

Par conséquent, je recommande d'utiliser la méthode standard à la place pour indiquer à votre compilateur que le code suivant est en C ++. Comme vous l'avez découvert, les compilateurs C ++ sont très pointilleux sur ce qu'ils acceptent. Par conséquent, la façon standard d'identifier C ++ est par les programmeurs d'intimidation ajouter à leur code C ++. Par exemple, la ligne suivante clarifiera à votre compilateur que ce qui suit est C ++ (et il ferait mieux de le compiler sans se plaindre).

// To the compiler: I know where you are installed. No funny games, capice?