予定の定義をCとリンク
-
18-09-2019 - |
質問
を考慮するCプログラムで構成され、ファイル
f1.c:
int x;
f2.c:
int x=2;
私の読の項6.9.2の は、C99の標準 このプログラムは不合格とすることが望ましい。私の解釈6.9.2可変 x
は仮定義される f1.c
, が、この仮定義が実際の定義には、翻訳単位で、私の意見、そして行動する場合 f1.c
載の定義 int x=0;
.
すべてのコンパイラと、重要なことは、配)にご来店頂きありがとういことなどが挙げられる。すべてのパトしたいリンク上記の二つのファイルの値 x
2の両方のファイルです。
かりではないように思えることにより、事故又はことを目的として、"簡単に"機能を提供するもののほか、基準があります。考えてみればであるということは特別な支援のリンカー用グローバル変数を持たない初期化子とその明示的に初期化されます。誰かが言うには、リンカー機能が必要となる場Fortranコンパイル。する合理的な説明をします。
意思いのか。その他の解釈、規格とは何ですか?名称プラットフォームファイル f1.c
や f2.c
を拒否するリンクの相互の関連性を検討した。
注意:ですので、この点は重要で、問題発生時の静的解析.の場合には、ファイルを拒否するリンク一部のプラットフォームの分析装置は文句が、各パムを受け入れで押されるわけではありませんの理由を戒めています。
解決
参照 何extern変数C.すべての標準における附属書として共通の延長:
J.5.11複数の外部定義
いは複数回答が可能である外部定義の識別子オブジェクトを明示的にキーワードextern;場合には定義に同意できない、または複数が初期化され、動作は未定義です(6.9.2).
警告
として@litbポイントで、記の私の回答のクロスに照合問題は、複数の定義グローバル変数が未定義の動作は、標準の方法によって組み合わせたもので"何が起こるかわからない面白".あなたのことが起きるのは、プログラムとして振る舞うと考えられていま;J.5.11は、"きラッキーができるようになるでしょう".が、コンピュータプログラムに依存する複数の定義extern可変の有無にかかわらず明示的な'extern'キーワードについては、厳格に適合プログラムなどは動作保証対象外とさせています。同様:が含まれます バグ る場合とならない。
他のヒント
の変数を定義し、複数回に限り、変数は一度だけ初期化されているとして許可されている標準は、「共通拡張子」と呼ばれるものがあります。 http://c-faq.com/decl/decldef.htmlする
リンクされたページでは、これはUnixプラットフォームに適切であると言います - 私はそれは、C89、C99としても同じだと思う - 多分デファクトスタンダードのいくつかの並べ替えを形成するために、より多くのコンパイラで採用されているが。面白います。
これはolovbによってコメントに私の答えを明らかにすることです
からコンパイルされたオブジェクトファイルのためのNMの出力「INT X;」。このプラットフォームでは、シンボルは「_」で先頭に追加されている、つまり、変数xは、_xとして表示されます。
00000000 T _main
U _unknown
00000004 C _x
U dyld_stub_binding_helper
からコンパイルされたオブジェクトファイルのためのNMの出力 "INT X = 1;"
00000000 T _main
U _unknown
000000a0 D _x
U dyld_stub_binding_helper
からコンパイルされたオブジェクトファイルのためのNMの出力 "INT X = 0;"
00000000 T _main
U _unknown
000000a0 D _x
U dyld_stub_binding_helper
からコンパイルされたオブジェクトファイルのためのNMの出力 "のextern INT X;"
00000000 T _main
U _unknown
U dyld_stub_binding_helper
編集:からコンパイルされたオブジェクトファイルのためのNMの出力「のextern int型のX;」 Xは、実際の関数のいずれかで使用される
00000000 T _main
U _unknown
U _x
U dyld_stub_binding_helper