5

まず第一に、状況をより正確に説明するより良いタイトルを見つけるのを手伝ってください. 私は、実際の (組み込み) コードをデバッグするときに遭遇した問題を簡略化して、次のバージョンを作成しました。

次の file のコードを考えてみましょう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 が複数存在するため、リンク エラーが予想されました。

実際には、2 つの変数のいずれかを初期化するとリンク警告 ( object size changes in different .o ) が表示され、両方を初期化するとエラー (複数の定義) が表示されます。

gcc 4.7 および 4.4 でこれを試しました。

これは予想される動作ですか?もしそうなら、ツールチェーン (gcc ベース) に警告するように指示するためにできることはありますか?

これはバグですか?

4

2 に答える 2