2016-05-31 8 views
4

unsigned long long이 현재 빌드 환경에서 사용 가능한지 어떻게 전처리 지시어로 검사 할 수 있습니까? 부호없는 long long을 사용할 수 있는지 확인

나는이 "avaibalble 없음"에 이르게 (그러나 일 것이다)
#if __STDC_VERSION__ >= 199901L 
    /* Available */ 
#else 
    /* Not available */ 
#endif 

을 확인하지만, GCC로 컴파일하고 이상없이 -std= -compiler 인수했습니다.

더 좋은 매크로가있어서 적어도 C99 표준 컴파일러와 함께 사용하고 -std=C99없이 GCC를 사용할 수 있습니까?

+8

가장 세련된 해결책은 아니지만 제 첫 번째 본능은'limits.h' 헤더에'ULLONG_MAX' 심볼이 있는지 확인하는 것입니다. –

+0

완료. 나는 당신이 더 좋은 대답을 얻지 못해서 놀랐다. 신속하고 더러운 솔루션이 때로는 최고라고 생각합니다! –

답변

1

가장 세련된 솔루션은 아니지만, 내 첫 번째 본능은 limits.h 헤더에 ULLONG_MAX 심볼이 있는지 확인하는 것입니다.

정의 된 경우 unsigned long long int 유형을 사용할 수 있습니다. 정의되지 않은 경우 유형을 사용할 수 없거나 최소한 지원이 잘되지 않으며 이식 가능하지 않은 컴파일러 확장으로 사용할 수 있습니다.

3

사용할 수없는 경우 어떻게 할 것입니까? 코드가 컴파일되고 작동해야합니까? 그렇지 않다면 검사를하지 말고 unsigned long long을 사용하면 컴파일러가 처리 할 수 ​​없는지를 알려줍니다.

그리고 C99 컴파일러에서 작동하는 매크로가 필요하다면 - C99는 unsigned long long을 요구하기 때문에 무의미합니다.

+0

그가 gcc로 컴파일하고 적어도 -std = -compiler 인수없이 두 번째 질문에 답하는 것이 확실합니다. "준비 할 수 없습니다"(그러나 작동 할 것입니다.) "* –

+0

1) 그러면 에뮬레이션해야합니다. 좀 더 작은'int'를 가진 64 비트 정수 연산. 코드는 중간 값에 대해서만 64 비트가 필요합니다. 2) 'long long'이 유효한지 확인하고 싶습니다. 코드는 모든 컴파일러에서 컴파일되어야하고 * 적어도 long long을 사용할 수있는 언급 된 상황을 감지해야합니다. 이상한 컴파일러에서'long long '을 발견 할 필요가 없습니다. – urzeit