C - 如何消除全局变量的使用



我在嵌入式环境中使用一个简单的json库,并试图摆脱用户代码中的全局变量。我这里有一个片段,试图解释我的情况。

该库有一个函数libjson_parser,每次需要解析 char 数组时都可以调用该函数。操作完成后,它将操作结果传递给使用libjson_callback_register注册为回调(在以下示例中json_post_parse(的函数。

由于我要分析不同类型的 json 数据包,因此我使用在调用解析器之前设置的全局变量parsing_config,以便可以在json_post_parse函数中执行正确的操作。

我知道使用全局变量是不受欢迎的,所以我正在寻找摆脱这个全局变量的方法,但不确定如何去做?

// library functions:
// libjson_callback_register
// libjson_parser
// user function, function signature fixed by library:
// json_post_parse
static uint8_t parsing_config = 0;
int main()
{
// register callback
libjson_callback_register(json_post_parse);
// dummy load
char[32] payload;
uint16_t len = 32;
// type A post parsing
parsing_config = 1;
libjson_parser(payload, len);
// type B
parsing_config = 2;
libjson_parser(payload, len);

return 0;
}

json_post_parse(json_obj* json)
{
switch(parsing_config) {
case 1:
//do something
break;
case 2:
// do something
break;
default:
break;
}
}
// library functions:
// libjson_callback_register
// libjson_parser
// user function, function signature fixed by library:
// json_post_parse

int main()
{
// dummy load
char[32] payload;
uint16_t len = 32;
// type A post parsing
// register callback1
libjson_callback_register(json_post_parse1);
libjson_parser(payload, len);
// type B
// register callback2
libjson_callback_register(json_post_parse2);
libjson_parser(payload, len);

return 0;
}

json_post_parse1(json_obj* json)
{
// do something1
}
json_post_parse2(json_obj* json)
{
// do something2
}

您可能应该按照 @CharlieBurns 的建议动态更改回调,但另一种方法是在 get/set 函数中隐藏静态:

int main()
{
// register callback
libjson_callback_register(json_post_parse);
// dummy load
char[32] payload;
uint16_t len = 32;
// type A post parsing
parse_config(1);
libjson_parser(payload, len);
// type B
parse_config(2);
libjson_parser(payload, len);

return 0;
}

uint8_t parse_config( uint8_t config )
{
static uint8_t parsing_config = 0;
if( parse_config != 0 )
{
parsing_config = config ;
}
return parsing_config ;
}

void json_post_parse(json_obj* json)
{
switch( parse_config(0) ) 
{
...
}
}

或者(更传统地(您可以将json_post_parse(json_obj* json)放在具有公共 setter 功能的单独翻译单元中。 该变量仍然具有文件范围,但它仅对那些有业务访问它的函数可见。 文件作用域不是全局作用域,只要变量对不需要查看它的函数不可见,就可以避免与全局变量相关的问题。 所以:

json_parse_callback.c

static uint8_t parsing_config = 0;
void parse_set_config( uint8_t config )
{
parsing_config = config ;
}

void json_post_parse(json_obj* json)
{
switch( parsing_config  ) 
{
...
}
}

json_parse_callback.h

#if !defined json_parse_callback_h
#define json_parse_callback_h
void parse_set_config( uint8_t config ) ;
void json_post_parse(json_obj* json) ;
#endif

主.c

int main()
{
// register callback
libjson_callback_register(json_post_parse);
// dummy load
char[32] payload;
uint16_t len = 32;
// type A post parsing
parse_set_config(1);
libjson_parser(payload, len);
// type B
parse_set_config(2);
libjson_parser(payload, len);

return 0;
}

相关内容

  • 没有找到相关文章

最新更新