c - 如何避免在 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 的情况下,我没有计算并想再次计算,因为没有进行计算。
我该如何处理这种情况?
解决方案
如果您想避免这种情况,请不要bar
调用foo
。由于显然bar
知道foo
,它可以调用适当的版本并将该决定留给调用者。
为调用的情况和bar
调用创建一个单独的函数:foo
tar
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()
{
...
}
推荐阅读
- reactjs - 从 useEffect 访问上下文
- apama - 来自 Cumulocity 中内置 Apama 运行时的 HTTP 请求
- c++ - 运行代码时访问冲突写入位置0x00000079
- java - Intellij-idea 类导入
- java - 使用特定区域设置/国家/地区的可读类型格式化日期
- html - 锚点在不同页面上的行为不同
- java - 基于查询参数动态改变Zuul中路由的url
- shell - lftp 将本地内容目录镜像到远程
- java - 向 C++ Java Enum 模拟器添加 c++17 constexpr 和其他改进
- pyspark - 如何根据另一个中的唯一记录或值为未知的 pyspark 数据框中选择记录