空指针、类型转换和可能的代码改进
Void pointers, type casting and possible code improvements
考虑代码如下:
void get_value_by_peek_name(json_object *json_obj, const char *peak_name, void **value) {
json_object *value_obj;
if (json_object_object_get_ex(json_obj, peak_name, &value_obj))
if (json_object_is_type(value_obj, json_type_double))
sscanf(json_object_to_json_string(value_obj), "%lf", *value);
}
如预期的那样,此实现会生成警告:
format ‘%lf’ expects argument of type ‘double *’, but argument 3 has type ‘void *’
我正在寻找更好地实现此功能的建议,当然,还要避免上面的警告。
在其他地方,还要考虑代码:
double timestamp;
void *holder;
// some other code...
// response_obj already initialized
get_value_by_peek_name(response_obj, "timestamp", &holder);
timestamp = *((double *) holder);
printf("- timestamp: %lf\n", timestamp);
有没有什么好方法可以让这段代码更优雅,而不用显式声明void pointer holder
但是通过直接使用timestamp
来保存值?
avoid the warning above.
定义get_value_by_peek_name()
以void*
作为最后一个参数:
void get_value_by_peek_name(json_object * json_obj, const char * peak_name, void * value)
确保 holder
指向一个 double
(或至少指向足够的内存,它也正确对齐以容纳 double
),然后
在对sscanf()
的调用中正确地转换指针,然后取消引用它:
sscanf(json_object_to_json_string(value_obj), "%lf", *((double**)value));
考虑代码如下:
void get_value_by_peek_name(json_object *json_obj, const char *peak_name, void **value) {
json_object *value_obj;
if (json_object_object_get_ex(json_obj, peak_name, &value_obj))
if (json_object_is_type(value_obj, json_type_double))
sscanf(json_object_to_json_string(value_obj), "%lf", *value);
}
如预期的那样,此实现会生成警告:
format ‘%lf’ expects argument of type ‘double *’, but argument 3 has type ‘void *’
我正在寻找更好地实现此功能的建议,当然,还要避免上面的警告。
在其他地方,还要考虑代码:
double timestamp;
void *holder;
// some other code...
// response_obj already initialized
get_value_by_peek_name(response_obj, "timestamp", &holder);
timestamp = *((double *) holder);
printf("- timestamp: %lf\n", timestamp);
有没有什么好方法可以让这段代码更优雅,而不用显式声明void pointer holder
但是通过直接使用timestamp
来保存值?
avoid the warning above.
定义
get_value_by_peek_name()
以void*
作为最后一个参数:void get_value_by_peek_name(json_object * json_obj, const char * peak_name, void * value)
确保
holder
指向一个double
(或至少指向足够的内存,它也正确对齐以容纳double
),然后在对
sscanf()
的调用中正确地转换指针,然后取消引用它:sscanf(json_object_to_json_string(value_obj), "%lf", *((double**)value));