我在嵌入式环境中使用一个简单的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;
}