空指针、类型转换和可能的代码改进

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.

  1. 定义get_value_by_peek_name()void*作为最后一个参数:

    void get_value_by_peek_name(json_object * json_obj, const char * peak_name, void * value)
    
  2. 确保 holder 指向一个 double(或至少指向足够的内存,它也正确对齐以容纳 double),然后

  3. 在对sscanf() 的调用中正确地转换指针,然后取消引用它:

    sscanf(json_object_to_json_string(value_obj), "%lf", *((double**)value));