【发布时间】:2019-07-21 12:46:15
【问题描述】:
我有从两个不同的代码流调用的函数 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()
test.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()和tar_foo(),并在每个函数中执行相应的工作,使用一个通用函数来完成通用工作。 (void bar_foo(void) { common_foo(); do_this();}` 和void tar_foo(void) { common_foo(); do_that(); }) 避开全局变量;这是一场可怕的噩梦。 -
避免全局变量传统上是通过引入额外的函数参数来完成的。
-
考虑扩展您的minimal reproducible example,添加一层中间函数,作为中间多层的占位符。 (实际上,您可能必须将代码引号/伪代码转换为 MCVE,然后使用占位符函数对其进行扩展...)。顺便说一句,StackOverflow 用户喜欢 MCVE,他们中的一些人(包括我不小心的时候)抱怨没有看到一个,即使问题不需要一个。尽一切努力制造一个,即使不是完全必要的,因此(不公平地)让你获得更好的感知......就像未来的“把戏”。 ;-)
-
我认为现在你为什么隐含不喜欢另一个参数变得更清楚了。我想我还是会走那条路,这基本上是 calebs 的回答。唉,我应该立即做出自己的回答,而不是先澄清你的情况和需求。
标签: c design-patterns globals