4

チームの他のメンバーが再現できない非常に苛立たしいバグがあります。プロジェクトのクリーニング、ディレクトリのワイプ、リポジトリからのプル、再構築、さらには VS 2013 でのテストも試みました。

背景: ac、bc、cc、および b.inc はすべて DLL にコンパイルされます (外部化されていると仮定します)。setfoo()マネージド コードから最初に呼び出されます。ここまでは順調ですね。

後でtestfoo()呼び出されます。グローバル変数は問題ありません。問題はありません。その後 testfoo2()、呼び出されます。ここからが興味深いところです。foo'sアドレスを指定してメモリ デバッガをオンにすると、メモリ内の 4 が読み取られます。ただし、Visual Studio でコードにカーソルを合わせると、0! が返されます。また、0 が出力されます。多くのグローバル変数があります (FILEハンドルを含み、それらはゼロにリセットされます (厄介な ASSERT 失敗の原因となります)、cc でのみですが、デバッガーで検査すると問題ありません)。問題のないものを含む他の多くの xc モジュールがあります。

わかりました、今testfoo()再び呼び出されます。bcワールドではすべてが順調です。恐ろしいのは、問題が私のワークステーションでのみ発生することです! これをデバッグする方法についての手がかりはありますか?

これは私の記憶によるものです。コードはこのスケルトンに非常に近いと思います。

ビーインク

int foo;

交流

#include <b.inc>
void setfoo(){
    foo = 4;
}

紀元前

#include <b.inc>
void testfoo(){
    printf(foo); //works
}

cc

#include <b.inc>
void testfoo2(){
    printf(foo); //foo is now 0
}

追加する: これは非常に複雑なレガシー コード (70 年代と考えてください) であり、非常に大規模な企業であり、あまり変更することはできません。extern の追加を開始すると、影響を受ける変数が何千もあります。また、1 つの変数で extern を試しましたが、そのファイルにはまだ問題があります。

私は一口を残しました。「testfoo2()」はマネージド スレッドで起動します。繰り返しますが、これは私のマシンに関連しているようです。ビジュアル スタジオの設定である可能性があります。この時点ではわかりません。ボックスのイメージを再作成したいだけです。

4

3 に答える 3

2

extern として宣言する必要があります。

extern int foo;

次に、ソース ファイルの 1 つ (および 1 つだけ) で、次のように定義します。

int foo;

そうすれば、1 つのソース ファイルにシンボルが 1 つだけ存在し、ヘッダーを含む他のすべてのソースがそれにリンクすることを認識します。省略した場合extern、各ソース ファイルは、独自のローカルのプライベート コピーがあると見なしますfoo

では、どのファイルでそれを定義する必要がありますか? 最も関連性の高いもの。というのはa.c、それは操作する関数を提供するからfooです。そのファイルを「所有者」と見なします。ただし、 で宣言し、が所有者b.incであることを示唆しているため、少し混乱します。b.c

于 2013-09-19T23:26:20.967 に答える
1

これを試して。

ビーインク

extern int foo;

交流

#include <b.inc>
int foo;

void setfoo(){
    foo = 4;
}
于 2013-09-19T23:25:06.963 に答える