2014-09-22 2 views
2

내 코드는 다음과 같은 것입니다 size_t로하는 경고하지 : GCC 플래그는 전화 foo(ZERO_CONSTANT)이 경고 할 것 GCC는 상수를 전달할 때 * 인수

#define ZERO_CONSTANT 0 
foo(size_t * p_size); 

foo(ZERO_CONSTANT); //Doesn't warn 

?

+3

불행히도 당신은'NULL'에'0'을 전달할 수 있으므로 여러분이 이것에 관해 할 수있는 일이 많지 않다고 생각합니다. –

+0

Paul은 [0은 포인터 문자 임] (http://stackoverflow.com/q/24212792/1708801). –

+0

첫 번째 질문은 왜 경고해야한다고 생각합니까? 당신이 잡으려고하는 오류는 무엇입니까? 어떤 종류의'0' 함수가 호출 될 때 경고를 받고 싶습니까? –

답변

5

여기에는 편집 플래그가 도움이되지 않습니다. C 표준은 모든 유형의 널 포인터 값에 대해 서기 위해 리터럴 0을 정의합니다. 꽤 자주 0, NULL(void*)0이 표시됩니다.

(이 그것이 정의되지 않은 동작 어떤 포인터 타입의 정수 값을 할당하는 것이 일반적을, 0은 널 포인터 리터럴 틀로서 사용이기 때문에 메모리 어드레스가 0 인 것을 의미하지 않는다는 것을 잘 참고).

+0

"could not possible"비트가 사실이 아닙니다. 컴파일러는 100 % 합법적 인 표준에 부합하는 것을 포함하여 무엇이든 경고 할 수 있습니다. –

+0

@ n.m. 사실이지만 내 주장을 유지할 것입니다. 내 "정의되지 않은 동작 비강 악마"컴파일러에서 컴파일 플래그를 허용하는 생각 중이 야. – Bathsheba

3

새로운 옵션이 있습니다. (아마도 GCC 4.7.x부터 사용 가능합니다) - -Wero-as-null-pointer-constant. 그것은 당신이 기대하는 일을하지만, C++에서만 유효합니다 ... C에서 여러분이 제시 한 코드는 완벽하게 합법입니다. 왜냐하면 NULL은 보통 "0"입니다.

+0

'stddef.h '헤더의 많은 구현은'NULL'을'(void *) 0'으로 정의하고 C 표준 (ISO 9899 : 2011)은'(void *) 0'과'0'을 모두 허용합니다. – fuz

1

앞서 언급 한 것처럼 0을 포인터로 전달하는 것이 완벽하게 유효합니다. 이 후 그 소리에 경고 생성

#define ZERO_CONSTANT ((int)0) 

:

warning: expression which evaluates to zero treated as a null pointer constant of type 'size_t *' (aka 'unsigned long *') [-Wnon-literal-null-conversion] 
expanded from macro 'ZERO_CONSTANT' 
#define ZERO_CONSTANT ((int)0) 

불행하게도 그것은 GCC 모양을 (4.8)는 ZERO_CONSTANT에 대한 정의를 변경 할 준비가되어 있다면 비록 당신은 어떤 컴파일러와 경고를 생성 할 수 있습니다 이 경우에는 심지어 -Wextra으로 경고를 생성하지 않지만이 경우 스위치를 활성화 할 수도있는 -W 스위치가 더있을 수 있습니다.

+0

gcc에서 -Withon-literal-null-conversion 플래그를 활성화 할 수 없으며 Google에서 아무 것도 찾지 못했습니다. 참조를 제공 할 수 있습니까? –

+0

죄송합니다 - 그것은 clang 경고입니다 - gcc를 확인하지 않았고 방금 비슷한 것을 가정했습니다. 나는 대답을 업데이트 할 것이다. –

관련 문제