c++ - with - visual studio clang




なぜこのプログラムは3つのC++コンパイラによって誤って拒否されますか? (20)

helloworld.png:ファイルが認識されません:ファイル形式が認識されません

明らかに、ハードドライブをフォーマットする必要があります。

実際、これらのエラーは読みにくいものではありません。

私は書いたC ++プログラムをコンパイルするのにいくつかの困難を抱えています。

このプログラムは非常にシンプルで、私の知る限り、C ++標準に定められているすべての規則に準拠しています。 私はISO / IEC 14882:2003全体を2回読んだことがあります。

プログラムは以下の通りです:

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

うんざり、私はg ++ 4.5.2を試しましたが、同様に役に立たなかった:

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

私はClang(バージョン3.0のトランク127530)が標準適合のために非常に高く評価されているので、動作しなければならないと考えました。 残念なことに、それは私には、かなり、強調表示されたエラーメッセージの1つを与えていない:

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)

正直言って、私は本当にこれらのエラーメッセージの意味を知りません。

他の多くのC ++プログラムでは拡張子が.cppのソースファイルがあるので、ファイルの名前を変更する必要があるかもしれません。 私はその名前をhelloworld.cppに変更したが、それは役に立たなかった。 私はClangに非常に深刻なバグがあると思います。なぜなら、名前を変更したプログラムをコンパイルするときに、「84個の警告と20個のエラーが発生しました。 私のコンピュータはビープ音を多く鳴らしました!

私はここで何をやったのですか? 私はC ++標準の重要な部分を見逃しましたか? あるいは、3つのコンパイラが本当に壊れているので、この単純なプログラムをコンパイルできないのですか?


Comic Sansをフォントとして使用するのを忘れてしまったので、それはそのエラーです。


File format not recognizedを適切にフォーマットする必要があります。 つまり、コードに適切な色とフォントを使用することです。 これらの色はコンパイラによって異なるため、各コンパイラの固有のドキュメントを参照してください。


最後の閉じ括弧の直前にコロンを付けた出力の精度を指定する必要があります。 出力は数値ではないため、精度はゼロです。このため、

:0}


あなたのコンパイラはASCIIを期待していますが、そのプログラムは明らかに EBCDICを使って書かれています。


あなたのコンパイラは、hmm ...エンコーディングのファイルをサポートしていないようです。 それをASCIIに変換してみてください。


あなたのプログラムをPNGからASCIIに変換しましたが、まだコンパイルされません。 あなたの情報のために、私は線幅100と250文字で試しましたが、どちらも同等の結果になりました。

   `         `  .     `.      `         ...                                                         
   +:: ..-.. --.:`:. `-` .....:`../--`.. `-                                                         
           `      `       ````                                                                      
                                                                      `                             
   ` `` .`       ``    .`    `.               `` .      -``-          ..                            
   .`--`:`   :::.-``-. : ``.-`-  `-.-`:.-`    :-`/.-..` `    `-..`...- :                            
   .`         ` `    ` .`         ````:``  -                  ` ``-.`  `                            
   `-                                ..                           ``                                
    .       ` .`.           `   `    `. ` .  . `    .  `    . . .` .`  `      ` ``        ` `       
           `:`.`:` ` -..-`.`-  .-`-.    /.-/.-`.-.  -...-..`- :```   `-`-`  :`..`-` ` :`.`:`- `     
            ``  `       ```.      ``    ````    `       `     `        `    `         `   `   .     
            : -...`.- .` .:/ `                                                                      
    -       `             `` .                                                                      
    -`                                                                                              
    `                                                                                               

あなたはブラケットの色を変えてみることもできます。 私はあなたのコンパイラは黒インクをrcognizeことができないと思う:P


このプログラムは有効です - エラーは見つかりません。

私の推測では、あなたのマシンにウイルスがあります。 ドライブを再フォーマットし、オペレーティングシステムを再インストールするのが最善の方法です。

それがどう機能するか、または再インストールの助けが必要な場合はお知らせください。

私はウイルスを嫌う。


この規格では、§2.1/ 1は次のように指定しています。

物理ソースファイルの文字は、必要に応じて、インプリメンテーション定義の方法で基本ソースキャラクタセット(行末インジケータの改行文字を導入)にマッピングされます。

あなたのコンパイラはそのフォーマットをサポートしていません(それを基本ソース文字セットにマップすることはできません)ので、それは後続の処理段階に移ることはできません。 コンパイラがイメージから基本ソース文字セットへのマッピングをサポートすることは完全に可能ですが、必須ではありません。

このマッピングは実装定義であるため、サポートするファイル形式を確認するには実装のドキュメントを参照する必要があります。 通常、すべての主要コンパイラベンダーは、(標準的に定義された)テキストファイルをサポートしています。テキストエディタで作成されたファイルで、通常は一連の文字です。

C ++標準はC標準(§1.1/ 2)に基づいており、C(99)標準は§1.2で述べていることに注意してください。

この国際規格は、
- Cプログラムがデータ処理システムで使用するために変換されるメカニズム。
- Cプログラムがデータ処理システムで使用するために呼び出されるメカニズム。
- 入力データがCプログラムで使用するために変換されるメカニズム。

ですから、ソースファイルの扱いは、コンパイラのドキュメントで見つける必要があります。


イメージをコンパイルしようとしています。

main.cppというドキュメントに書いたものをタイプし、コンパイラでそのファイルを実行し、出力ファイルを実行します。


コンパイラはエキスパートモードに設定されていますか? はいの場合、コンパイルしないでください。 現代のコンパイラは "Hello World!"に疲れています。


以下のインクルードファイルを作ってコンパイルしてください:

#include <ChuckNorris>

彼が構文エラーをコンパイルできると聞きました...


入力インターフェースを切り替えてみてください。 C ++では、スキャナーではなくキーボードがコンピュータに接続されています。 周辺機器の競合の問題がある可能性があります。 私はキーボード入力インターフェースが必須であればISO標準をチェックしませんでしたが、それはこれまでに使用したすべてのコンパイラに当てはまります。 しかし、おそらくスキャナの入力がC99で利用可能になりました。この場合、あなたのプログラムは実際に動作するはずです。 そうでない場合は、次の標準リリースとコンパイラのアップグレードを待つ必要があります。


最初の問題は、main関数の最後に間違った値を返そうとしていることです。 C ++標準では、main()の戻り値の型はintであるが、空のセットを返そうとしています。

もう1つの問題は、少なくともg ++では、コンパイラがファイルサフィックスから使用する言語を推論することです。 g ++(1)から:

任意の入力ファイルに対して、ファイル名の接尾辞によってどのような種類のコンパイルが行われるかが決まります。

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

事前処理が必要なC ++ソースコード。 .cxxでは、最後の2文字は文字通りxでなければならないことに注意してください。 同様に、.Cはリテラルの資本Cを指します。

これらを修正すると、 hereのデモからわかるように、完全に機能するHello Worldアプリケーションが残されます。


次のPythonスクリプトを試すことができます。 PILpytesserをインストールする必要があることに注意してください。

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

それを使用するには、次のようにします。

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

残念ながら、C ++だけでなく、複数の言語をサポートする3つのコンパイラを選択しました。 彼らは皆、あなたが使ったプログラミング言語を推測しなければなりません。 すでに知っているように、PNG形式はC ++だけでなくすべてのプログラミング言語に適しています。

通常、コンパイラは言語自体を理解することができます。 例えば、PNGが明らかにクレヨンで描画されている場合、コンパイラはそれにVisual Basicが含まれていることを認識します。 機械式の鉛筆で描かれているように見える場合、FORTRANコードを書くことで、エンジニアを仕事場で認識するのは簡単です。

この2番目の手順は、この場合でもコンパイラのどちらにも役立ちません。 CとC ++は#include似ています。 したがって、実際にどの言語をコンパイラが決定するのを助ける必要があります。 さて、あなたは非標準的な手段を使うことができました。 たとえば、Visual Studioコンパイラは/ TCおよび/ TPコマンドライン引数を受け入れるか、プロジェクトファイルで "Compile as:C ++"オプションを使用できます。 GCCとCLangには私自身が知らない独自のメカニズムがあります。

したがって、代わりに標準のメソッドを使用して、コンパイラに次のコードがC ++であることを伝えることをお勧めします。 あなたが今までに発見したように、C ++コンパイラは、受け入れるものについて非常にぞっとしています。 したがって、C ++を識別する標準的な方法は、プログラマが彼らのC ++コードに追加するという脅迫によるものです。 たとえば、次の行では、コンパイラはC ++であることをコンパイラに明示します(そして、コンパイルしなくてもコンパイルする方がよいでしょう)。

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

私は「戻る」とセミコロンの間の性格を認識できない唯一の人ですか? それはそれかもしれません!


私は魔法のマーカーを使って自分のコードを自分のモニターのガラスに書き込まないようにしました。 画面が速すぎると、きれいなモニターを私に渡す人が毎週私に名前を呼んでいます。

私の従業員の2人(私はマネージャーです)が、ノブを持った赤いパッドのコンピュータの1つを私に買うためにチップを入れています。 彼らは私がマーカーが必要ではないと私はそれがいっぱいになったときに自分自身をきれいにすることができますが、私はそれを慎重に揺らす必要があると言った。 私はそれが繊細であると思いました。

だからこそ私は賢い人を雇うのです。


追加:

using namespace std;

直後:P:D







clang