1. ホーム
  2. c++

[解決済み] なぜこのプログラムは3つのC++コンパイラで誤って拒否されるのですか?

2022-03-20 10:13:31

質問

書いた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 (version 3.0 trunk 127530)はその標準適合性で高く評価されているので、きっと動くだろうと思いました。 残念ながら、そのきれいで強調されたエラーメッセージの一つも出してくれませんでした。

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 warnings and 20 errors generated." と表示され、コンピュータがたくさん鳴ったからです!Clangには非常に深刻なバグがあると思います。

私はここで何を間違えたのでしょうか? C++規格の重要な部分を見逃していたのだろうか? それとも、3つのコンパイラとも、この単純なプログラムをコンパイルできないほど、本当に壊れているのだろうか?

どうすればいい?

規格では、§2.1/1に規定されています。

物理的なソースファイルの文字は、必要に応じて、実装で定義された方法で、基本的なソース文字セットにマッピングされます(行末指示のために改行文字を導入します)。

あなたのコンパイラはそのフォーマットをサポートしていません(つまり、そのフォーマットを 基本ソース文字セット そのため、次の処理段階に進むことができず、エラーとなります。コンパイラが画像から基本ソース文字セットへのマッピングをサポートしていることは十分あり得ますが、必須ではありません。

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


C++規格はC規格(§1.1/2)をベースにしており、C(99)規格は§1.2でこう言っていることに注意してください。

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

ですから、繰り返しになりますが、ソースファイルの扱いは、コンパイラのドキュメントで確認する必要があります。