나는 C 프로그램을 만들고있다. 두 개의 포인터 인수를 취하고 복잡한 연산을 수행하는 함수가 있습니다. 'cmp'라고 해봅시다. 설명을 위해 cmp()는 결코 복잡하지 않습니다.GCC 경고에 대한 해결 방법을 얻으려면 "XXX의 주소가 절대 NULL이 아닙니다"?
int cmp(struct foo *a, struct foo *b) { return (a->bar == b->bar); }
나는이처럼 NULL 검사 매크로를하고 싶습니다 :
#define SAFE_CMP(a,b) ((a) != NULL && (b) != NULL) ? cmp(a,b) : 0
나는이 완벽하게 정상적으로 생각합니다. 그러나 오류로 경고를 간주 -Wall의 컴파일시 스위치에서, 다음과 같은 코드가 골치 : GCC는이 상황을 해결하기 위해 어떤 방법이 있나요 "the address of b will never be NULL".
경고
int baz(struct foo *a) { struct foo b; ... return SAFE_CMP(a, &b); }
때문에? SAFE_CMP_1(safe_arg,unsafe_arg), SAFE_CMP_2(unsafe_arg,safe_arg)
... 등, 다양한 헬퍼 매크로를 가지는 것은 내가 원하는 마지막 것입니다. 모든 상황에 대해 하나의 도우미 매크로를 appricable하게하고 싶습니다.
미리 감사드립니다.
#define SAFE_CMP(a,b) ((void *)(a) != NULL && (void *)(b) != NULL) ? cmp(a,b) : 0
을 ...하지만 개인적으로, 난 그냥 함수 자체 safe_cmp()
을 만들 것입니다 :
철 웅 양
GCC pragma 중 하나를 사용하여 매크로의 Null-Check 부분에 대한 경고를 비활성화 한 다음 다시 활성화 할 수 있습니다. –
나는 이것이 당신을 사는지 알지 못합니다. 'cmp()'함수가 왜 이런 체크를 할 수 없는지? – BobbyShaftoe