467 Stimmen

Warum wird dieses Programm von drei C++-Compilern fälschlicherweise abgelehnt?

Ich habe Schwierigkeiten beim Kompilieren eines C++-Programms, das ich geschrieben habe.

Dieses Programm ist sehr einfach und entspricht, soweit ich weiß, allen Regeln des C++-Standards. Ich habe die gesamte ISO/IEC 14882:2003 zweimal durchgelesen, um sicherzugehen.

Das Programm sieht folgendermaßen aus:

enter image description here

Hier ist die Ausgabe, die ich erhielt, als ich versuchte, dieses Programm mit Visual C++ 2010 zu kompilieren:

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

Enttäuscht versuchte ich es mit g++ 4.5.2, aber auch das war nicht hilfreich:

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

Ich dachte mir, dass Clang (Version 3.0 trunk 127530) funktionieren muss, da es für seine Standardkonformität so hoch gelobt wird. Leider hat es mir nicht einmal eine seiner hübschen, hervorgehobenen Fehlermeldungen angezeigt:

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)

Um ehrlich zu sein, weiß ich nicht wirklich, was diese Fehlermeldungen bedeuten.

Viele andere C++-Programme haben Quelldateien mit einer .cpp Erweiterung, also dachte ich, dass ich meine Datei vielleicht umbenennen müsste. Ich änderte ihren Namen in helloworld.cpp aber das hat nicht geholfen. Ich glaube, es gibt einen sehr schwerwiegenden Fehler in Clang, denn als ich versuchte, das umbenannte Programm damit zu kompilieren, flippte es aus, gab "84 Warnungen und 20 Fehler generiert" aus und ließ meinen Computer viel piepen!

Was habe ich hier falsch gemacht? Habe ich einen kritischen Teil des C++-Standards übersehen? Oder sind alle drei Compiler wirklich so kaputt, dass sie dieses einfache Programm nicht kompilieren können?

56voto

Andrew Cooper Punkte 31583

Sie haben den Präprozessor vergessen. Versuchen Sie dies:

pngtopnm helloworld.png | ocrad | g++ -x 'c++' -

8 Stimmen

Oh! Ich dachte, der Präprozessor sei im Compiler enthalten! Ich werde versuchen, einen Präprozessor zu finden, der auf meinem Windows-Laptop funktioniert.

3 Stimmen

@James McNellis: Der Präprozessor ist kein Programm, sondern eine Hardware, die wie eine Markierung aussieht - man bewegt sie über den Text und er wird vorverarbeitet.

49voto

Kevin Lacquement Punkte 4951

Haben Sie das Programm handschriftlich geschrieben und dann in den Computer eingescannt? Das ist es, was die Datei "helloworld.png" andeutet. Wenn das der Fall ist, müssen Sie sich darüber im Klaren sein, dass der C++-Standard (selbst in seiner neuesten Ausgabe) das Vorhandensein einer optischen Zeichenerkennung nicht vorschreibt, und leider ist sie auch in keinem aktuellen Compiler als optionale Funktion enthalten.

Sie sollten in Erwägung ziehen, die Grafiken in ein Textformat zu übertragen. Sie können einen beliebigen Texteditor verwenden; die Verwendung eines Textverarbeitungsprogramms kann zwar einen hübschen Ausdruck erzeugen, führt aber höchstwahrscheinlich zu demselben Fehler, den Sie beim Scannen erhalten.

Wenn Sie wirklich abenteuerlustig sind, können Sie versuchen, Ihren Code in ein Textverarbeitungsprogramm zu schreiben. Drucken Sie ihn aus, vorzugsweise in einer Schriftart wie OCR-A . Nehmen Sie dann Ihren Ausdruck und scannen Sie ihn wieder ein. Der Scan kann dann durch ein OCR-Paket eines Drittanbieters geleitet werden, um ein Textformular zu erstellen. Das Textformular kann dann mit einem der vielen Standard-Compiler kompiliert werden.

Beachten Sie jedoch den hohen Papieraufwand, den dies in der Debugging-Phase verursacht.

0 Stimmen

Das Henne-Ei-Dilemma: Ist es möglich, C++-Code für eine OCR-Software zu schreiben und sie ohne OCR zu kompilieren?

5 Stimmen

Natürlich verwenden Sie die Baugruppe für die ursprüngliche OCR.

0 Stimmen

@jweyrich - Ich denke, Sie müssen zuerst Ihr C++/OCR mit Ihrer asm/OCR-Toolchain booten.

46voto

Grofit Punkte 16287

Zeichnen Sie das folgende Include, damit es kompiliert werden kann:

#include <ChuckNorris>

Ich habe gehört, er kann Syntaxfehler kompilieren...

46 Stimmen

Ich persönlich bevorzuge #include <JonSkeet> .

40voto

MSalters Punkte 166675

Leider haben Sie drei Compiler ausgewählt, die alle mehrere Sprachen unterstützen, nicht nur C++. Sie alle müssen erraten, welche Programmiersprache Sie verwendet haben. Wie Sie wahrscheinlich bereits wissen, ist das PNG-Format für alle Programmiersprachen geeignet, nicht nur für C++.

Normalerweise kann der Compiler die Sprache selbst herausfinden. Wenn das PNG beispielsweise offensichtlich mit Buntstiften gezeichnet ist, weiß der Compiler, dass es Visual Basic enthält. Sieht es aus, als wäre es mit einem Bleistift gezeichnet worden, ist es einfach, den Ingenieur zu erkennen, der FORTRAN-Code schreibt.

Auch dieser zweite Schritt hilft dem Compiler in diesem Fall nicht weiter. C und C++ sehen sich einfach zu ähnlich, bis hin zum #include . Daher müssen Sie dem Compiler bei der Entscheidung helfen, um welche Sprache es sich wirklich handelt. Sie könnten nun nicht standardisierte Mittel verwenden. Zum Beispiel akzeptiert der Visual Studio Compiler die /TC und /TP Befehlszeilenargumente, oder Sie können die Option "Kompilieren als: C++"-Option in der Projektdatei verwenden. GCC und CLang haben ihre eigenen Mechanismen, die ich nicht kenne.

Daher würde ich empfehlen, stattdessen die Standardmethode zu verwenden, um dem Compiler mitzuteilen, dass der folgende Code in C++ geschrieben ist. Wie Sie inzwischen festgestellt haben, sind C++-Compiler sehr wählerisch bei dem, was sie akzeptieren. Daher ist die Standardmethode zur Erkennung von C++ die Einschüchterung, die Programmierer ihrem C++-Code hinzufügen. Die folgende Zeile zum Beispiel wird Ihrem Compiler klar machen, dass es sich bei dem folgenden Code um C++ handelt (und er sollte ihn besser ohne Beschwerden kompilieren).

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

10 Stimmen

Ich dachte #pragma die richtige Art und Weise war, dem Compiler eine Nachricht zu übermitteln?

33voto

Chris Cudmore Punkte 28967

Versuchen Sie dies:

Do you see the dinosaur in the space shuttle?

4 Stimmen

Ich glaube, es ist ein Tippfehler - es sollte heißen endl (L) nicht end1 (eins). Aber +1 schön gemacht!

44 Stimmen

Ich starre schon seit drei Stunden darauf, aber ich kann immer noch keinen Dinosaurier oder das Space Shuttle sehen :-(

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X