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


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:

enter image description here

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

Découragé, j'ai essayé g ++ 4.5.2, mais c'était tout 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 un .cpp extension, alors je pensais peut-être que je devais 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 fait beaucoup bip de mon ordinateur!

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


471


origine


Réponses:


Dans la norme, le §2.1 / 1 spécifie:

Les caractères du fichier source physique sont mappés, d'une manière définie par l'implémentation, au jeu de caractères source de base (introduction de caractères de nouvelle ligne pour les indicateurs de fin de ligne) si nécessaire.

Votre compilateur ne supporte pas ce format (aka ne peut pas le mapper au jeu de caractères source de base), de sorte qu'il ne peut pas passer à d'autres étapes de traitement, d'où l'erreur. Il est tout à fait possible que votre compilateur prenne en charge un mappage de l'image au jeu de caractères source de base, mais n'est pas nécessaire.

Comme ce mappage est défini par l'implémentation, vous devez consulter la documentation de votre implémentation pour voir les formats de fichier pris en charge. En règle générale, tous les principaux fournisseurs de compilateurs prennent en charge les fichiers texte (définis de manière canonique): tout fichier produit par un éditeur de texte, généralement une série de caractères.


Notez que la norme C ++ est basée sur la norme C (§1.1 / 2), et la norme C (99) indique, au §1.2:

La présente Norme internationale ne spécifie pas
  - le mécanisme par lequel les programmes C sont transformés pour être utilisés par un traitement de données   système;
  - le mécanisme par lequel les programmes C sont invoqués pour être utilisés par un traitement de données   système;
  - le mécanisme par lequel les données d'entrée sont transformées pour être utilisées par un programme C;

Donc, encore une fois, le traitement des fichiers sources est quelque chose que vous devez trouver dans la documentation de vos compilateurs.


174



Originaire de Overv @ reddit.


576



Essayez de cette façon:

enter image description here


320



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


212



Vous pouvez essayer le script python suivant. Notez que vous devez installer PIL et pytesser.

from pytesser import *
image = Image.open('helloworld.png')  # Open image object using PIL
print image_to_string(image)     # Run tesseract.exe on image

Pour l'utiliser, faites:

python script.py > helloworld.cpp; g++ helloworld.cpp

157



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


111



Je ne peux pas voir une nouvelle ligne après ce dernier accolade.

Comme vous le savez: "Si un fichier source non vide ne se termine pas par un caractère de nouvelle ligne, le comportement est indéfini".


76



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 lecteur 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éinstallation.

Je déteste les virus.


75