gpt4 book ai didi

c - 如何避免在 C 中使用 global 来检测变量的设置?

转载 作者:行者123 更新时间:2023-12-04 11:05:02 27 4
gpt4 key购买 nike

我有从两个不同的代码流调用的函数 foo()。
假设这两个代码流有两个不同的函数调用 foo()

bar() 和 tar()

我想根据哪个函数(bar() 或 tar()) 调用了 foo() 来做一些决定。
目前,我正在设置全局变量 IN_BAR = 1;在 bar() 和 IN_BAR = 0 的情况下;在 tar 的情况下。
然后我检查 foo() 中“IN_BAR”的值并做一些事情。

int IN_BAR = 0; // global

void bar () {
...
IN_BAR = 1;
foo();
IN_BAR = 0;
..
}

void tar() {
...
foo();
...
}

void foo() {
...
if (IN_BAR)
do_this();
else
do_that();
}

目前,有很多地方(在代码库中)看起来像这样。我想避免使用全局变量以及设置和重置全局变量。
有没有办法处理上述情况?还是这里有设计缺陷?

编辑:
有些情况下 bar() 和 tar() 不直接调用 foo(),即中间有很多调用,但必须在 bar() 和 tar() 处做出决定。

bar()->filler1()->filler2()->foo()
tar()->func1()->func2()->foo()

测试.c
#include <stdio.h>
// globals
int data = 0;
int IN_BAR = 0;

int calculate()
{
// Some algorithm.
return 10;
}

void foo()
{
if (!IN_BAR)
data = calculate();
// Use data in this method.
printf("Data: %d\n", data);
}

// This function is a place holder for multiple functions.
void func_bar()
{
foo();
}

void bar()
{
IN_BAR = 1;
data = calculate();
func_bar();
IN_BAR = 0;
}

// This function is a place holder for multiple functions.
void func_tar()
{
foo();
}

void tar()
{
func_tar();
}

int main()
{
int c = 1;
if (c == 1)
bar();
else
tar();
return 1;
}

我正在计算 bar 内的一些东西并想在 foo() 中重用,但在 tar 的情况下,我没有计算并且想再次计算,因为没有进行计算。

我该如何处理这个案子?

最佳答案

如果你想避免这种情况,那就不要 bar调用 foo .由于显然 bar知乎 foo ,它可以调用适当的版本并将该决定留给调用者。

bar 的情况创建一个单独的函数电话footar调用 foo :

void bar () {
...
foobar();
..
}

void tar() {
...
footar();
...
}

void foobar() {
...
do_this();
}
void footar() {
...
do_that();
}

编辑:

为避免进行大量代码更改,您只能更改当前使用全局变量的位置(并添加了 Jonathan Leffler 的建议):
void bar () {
...
foobar(); // change only here
..
}

void tar() {
...
foo();
...
}

void foobar() {
foocommon();
do_this();
}
void foo() {
foocommon();
do_that();
}
void foocommon()
{
...
}

关于c - 如何避免在 C 中使用 global 来检测变量的设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54911523/

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