gpt4 book ai didi

c - 在某些 C 文件中无法看到全局变量,值似乎已重置

转载 作者:太空狗 更新时间:2023-10-29 15:35:59 25 4
gpt4 key购买 nike

我有一个非常令人沮丧的错误,团队中的其他人无法重现。我已经尝试清理项目、删除目录、从存储库中提取、重建,甚至在 VS 2013 中进行测试。

背景:a.c、b.c、c.c和b.inc都被编译成一个DLL(假设它们是externed的)。 setfoo() 首先从托管代码调用。到目前为止一切顺利。

稍后,将调用 testfoo()。全局变量很好,没有问题。然后调用 testfoo2()。这就是事情变得有趣的地方。我用 foo 的 地址打开了内存调试器,它将在内存中读取 4。但是,如果您将鼠标悬停在 visual studio 中的代码上,它会返回 0!。此外,它将输出 0。有许多全局变量(包括 FILE 句柄,它们被重置为零(导致讨厌的 ASSERT 失败),仅在 c.c 中,但在使用调试器检查时没问题)。还有许多其他 x.c 模块没有问题。

好的,现在再次调用 testfoo()。在 b.c 世界一切都很好。可怕的是这个问题只发生在我的工作站上!关于如何调试这个的任何线索?

这是我的内存,我相信代码非常接近这个框架:

b.inc

int foo;

交流

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

BC

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

抄送

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

要补充:这是非常复杂的遗留代码(想想 70 年代),在一家非常大的公司中,无法更改太多。如果我们开始添加 extern,将有数千个变量受到影响。另外,我在一个变量上尝试了 extern,但该文件仍然存在问题。

我漏掉了一个花絮。 'testfoo2()' 在托管线程中启动。 同样,这似乎与我的机器有关,可能是 visual studio 中的一些设置,此时不知道,我们只想重新成像盒子。

最佳答案

你需要声明为外部:

extern int foo;

然后在一个(而且只有一个)源文件中定义它:

int foo;

这样一来,一个源文件中只有一个符号,包括标题在内的所有其他源都知道链接到它。如果您省略 extern,那么每个源文件都认为它有自己的本地私有(private) foo 副本。

那么应该在哪个文件中定义呢?最相关的那个。我会说 a.c,因为它提供了对 foo 进行操作的函数。我认为该文件是“所有者”。但是,这有点令人困惑,因为您在 b.inc 中声明它,暗示 b.c 是所有者。

关于c - 在某些 C 文件中无法看到全局变量,值似乎已重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18906522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com