まず、状況をより正確に説明するためのより良いタイトルを見つけるのを手伝ってください。現実の(埋め込み)コードをデバッグする際に遭遇した次の単純化された問題のバージョンを作成しました。初期化されていない同じ名前のグローバル変数 - 奇妙なリンクの振る舞い
は、ファイルt1.c
の次のコードを考えてみましょう:
#include <stdio.h>
int A;
void f() { printf("%d\n", A); }
extern void g();
void main(void)
{
g(); A=1; g();
A++;
f();
}
とt2.c
のコード:
#include <stdio.h>
double A;
void g()
{
A += 1.0;
printf("%f\n", A);
}
さて、このようなコードをコンパイルして実行している:
gcc -Wall t1.c t2.c -o t && ./t
は
を与えます1.000000
2.000000
1
両方のファイルには、異なるタイプのグローバル変数呼び出しA
が含まれています。シンボルAは複数回存在するため、リンクエラーが予想されました。
は、私は実際に、私はそれらの両方を初期化し、私は二つの変数の1、エラー(複数の定義)を初期化(異なるの.oでオブジェクトサイズの変更)リンクの警告を取得します。
gcc 4.7と4.4で試しました。
これが期待どおりの動作ですか?もしそうなら、には私がtoolchain(gccベース)に警告するために何かできることがあります。?
これはバグですか?
答えてくれてありがとう:私は、初期化されていないグローバルがいわゆる* common * -blockに入ることに気づいていませんでした。 –