[解決済み] なぜこのプログラムは3つのC++コンパイラで誤って拒否されるのですか?
質問
書いた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プログラムで使用するために入力データを変換するメカニズム。
ですから、繰り返しになりますが、ソースファイルの扱いは、コンパイラのドキュメントで確認する必要があります。
関連
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】'cout'は型名ではない
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】C++の余分な資格エラー
-
[解決済み] 出力ファイル debugserbest.exe を開けません。パーミッションが拒否されました
-
[解決済み] 8192個の要素にループをかけると、プログラムが遅くなるのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み】なぜ私のプログラムはWindows 7でフランス語でコンパイルできないのですか?[クローズド]