首页 > 解决方案 > 如何避免在 C 中使用 global 来检测变量的设置?

问题描述

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

bar() 和 tar()

我想根据哪个函数(bar()或tar())调用了foo()来做一些决定。目前,我正在设置全局变量 IN_BAR = 1; 在 bar() 和 IN_BAR = 0 的情况下;在焦油的情况下。然后我检查 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 的情况下,我没有计算并想再次计算,因为没有进行计算。

我该如何处理这种情况?

标签: cdesign-patternsglobals

解决方案


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

为调用的情况和bar调用创建一个单独的函数:footarfoo

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()
{
    ...
}

推荐阅读