다음과 같이 코드를 고려하십시오.
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 포인터 를 선언하지 않고 값 을 직접 사용 하여이 코드를 더 우아 하게 만드는 좋은 방법이 있습니까? holder
timestamp
위의 경고를 피하십시오.
마지막 매개 변수 get_value_by_peek_name()
를 사용하도록 정의하십시오 void*
.
void get_value_by_peek_name(json_object * json_obj, const char * peak_name, void * value)
확인 holder
A와 점 double
(또는뿐만 아니라 제대로 정렬되어 충분한 메모리에 적어도를 개최 double
한 후)
참조를 해제 하기 sscanf()
전에 호출에서 포인터를 올바르게 캐스팅합니다 .
sscanf(json_object_to_json_string(value_obj), "%lf", *((double**)value));
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다