gpt4 book ai didi

c++ - 错误 : X may be used uninitialized in this function in C

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:24:31 26 4
gpt4 key购买 nike

我收到这个错误

error: Access.Core may be used uninitialized in this function

这是我的代码:

 static int FirstTime = 1;
MyStruct Access;

if (FirstTime) {
FirstTime = 0;
Access = Implementation();
DoSomething(Access);
}

if(Other_Variable) {
Access = Implementation2();
DoSomething(Access);
}

//The Other_Variable will be set to 1 and to 0 by other part of the code

我的代码是这样的,因为我只想在第一次调用函数实现。在每次调用中,Access 变量都会更新,因此将其设为静态没有多大意义。

如果我将 Access 设置为静态,但我不喜欢将其设置为静态,因为在所有其他调用中,Access 都将被更新。有什么方法可以避免这个问题而不让它成为静态的?

也欢迎任何更好的选项,只执行一次函数而不是使用静态变量。

最佳答案

像这样制作 Access(并删除 FirstTimeif):

static MyStruct Access = Implementation(this_b);

您收到此警告的原因是静态变量在一次函数调用后仍然存在。它们的值在所有函数调用中保留(考虑哪个线程调用该函数)。因此,FirstTime 将控制您是否初始化 Access。第一次调用代码所在的函数时,将正确初始化 Access 变量。但是随着每次进一步的函数调用,FirstTime 为零,您将不再初始化Access,因此将在代码中使用未初始化的变量.

编辑:现在,根据您的更新信息,您说您有两个实现 功能。第一次你想使用一个,所有其他时候你想使用另一个功能。那么这个怎么样:

 // static will be false/zero by default
static bool AlreadyCalled;
MyStruct Access;

if (!AlreadyCalled) {
Access = Implementation();
AlreadyCalled = true;
} else {
Access = Implementation2();
}

不过,根据您的实际用例,可能有更好的方法来处理这个问题。例如,为什么不更新 Access 的状态,如下所示:

// let the default constructor initialize it
// to a plausible state
static MyStruct Access;

// use RAII to update the state of Access when this
// function returns.
MyUpdater updater(Access);

// now, do whatever the function does.

对于 MyUpdater 是这样的:

struct MyUpdater {
MyStruct &s;
MyUpdater(MyStruct &s):s(s) { }
~MyUpdater() {
s.ChangeState();
}
};

该模式称为 RAII:您将一些有用的操作与本地分配对象的构造函数和析构函数相关联。

关于c++ - 错误 : X may be used uninitialized in this function in C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/628410/

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