2 つのファイルで構成される C プログラムを考えてみましょう。
f1.c:
int x;
f2.c:
int x=2;
C99 標準のパラグラフ 6.9.2 を読んだところでは、このプログラムは拒否されるべきだということです。6.9.2 の私の解釈では、 variablex
は で暫定的に定義されていますが、この暫定的な定義は翻訳単位の最後で実際の定義になるため、(私の意見では)定義が含まf1.c
れているかのように動作するはずです。f1.c
int x=0;
私が試すことができたすべてのコンパイラ(そして重要なことに、リンカー)で、これは起こりません。私が試したすべてのコンパイル プラットフォームは上記の 2 つのファイルをリンクしておりx
、両方のファイルで の値は 2 です。
これが偶然に起こったのか、それとも標準が要求するものに加えて提供する「簡単な」機能として起こったのかは疑わしい. 考えてみれば、明示的にゼロに初期化されたものとは対照的に、イニシャライザを持たないグローバル変数に対するリンカーでの特別なサポートがあることを意味します。いずれにせよ、Fortran をコンパイルするにはリンカ機能が必要かもしれないと誰かが私に言いました。それは合理的な説明でしょう。
これについて何か考えはありますか?標準の他の解釈?f1.c
ファイルとf2.c
リンクを拒否するプラットフォームの名前は?
注: 質問は静的分析のコンテキストで発生するため、これは重要です。2 つのファイルが何らかのプラットフォームでリンクされることを拒否する可能性がある場合、アナライザーはエラーを表示する必要がありますが、すべてのコンパイル プラットフォームがそれを受け入れる場合、それについて警告する理由はありません。