2014-10-03 1 views
1

다음 프로그램은 4.8.1GCC의 PRIuPTR 전처리 기 버그? GCC와 C++로 컴파일 할 때 컴파일 할 때

#include <inttypes.h> 
#include <stdint.h> 
#include <stdio.h> 

int main() { 
    uintptr_t i = 0; 
    i--; 
    printf("%" PRIuPTR "\n", i); 
    return 0; 
} 

다음과 같은 오류 메시지가

a.cc: In function 'int main()': 
a.cc:8:13: error: expected ')' before 'PRIuPTR' 
    printf("%" PRIuPTR "\n", i); 
      ^

그것은 컴파일 및 Microsoft 컴파일러로 제대로 실행, 심지어는 GCC와 함께 제공 C.

내가 누락되었거나 GCC의 버그입니까? 후자의 경우 해결 방법이 있습니까?

+1

'-std = C++ 11'을 사용하여 C++ 11로 컴파일하고 있습니까? 그 전에는 표준 C++이 아니 었습니다 (C99 라이브러리의 일부인 반면 C++ 98은 C90 라이브러리 만 포함). –

+0

또한 왜 다른 언어의 컴파일러로 C 코드를 컴파일하려고합니까? –

+0

@MikeSeymour 예; 그것은 아무런 차이가 없습니다. – rwallace

답변

3

C 표준은 C++에서 C 헤더를 포함에 대해 이렇게 말한다 :

C++ 구현 __STDC_FORMAT_MACROS가 포함되어 <inttypes.h> 전에 정의 된 경우에만이 매크로를 정의해야합니다.

그리고 Microsoft는 그렇지 않지만 GCC가이 권장 사항을 따르는 것으로 보입니다.

이 매크로를 정의하고 더 이상 사용되지 않는 C 헤더를 포함하는 대신 이러한 매크로를 무조건 정의하는 C++ 헤더 <cinttypes>을 사용하는 것이 더 좋은 해결책입니다. (코멘트에서 언급 한 바와 같이, C++ 표준은 특히 매크로는 C++ 헤더에 영향을주지 않습니다 말한다.)

을 다른 방법으로, 더 편리한 (및 형태 보증) C++ 대안이 때 C 라이브러리 사용을 중지 std::cout << i;

+0

27.9.2 C 라이브러리 파일 [c.files] :'[참고 : 에 정의 된 매크로는 무조건 제공됩니다. 특히 C 표준의 각주 182에 언급 된 __STDC_FORMAT_MACROS 심볼 은 C++에서 아무런 역할을하지 않습니다. -end note]'C++ 11 +에서 매크로의 유일한 언급입니다. – Deduplicator

+0

'[c.files]'§4 헤더가 몇 가지 무관 한 변경 사항을 제외하고는 동일한 내용을 포함해야한다고 명시 적으로 말합니다. – Deduplicator

+0

@Deduplicator : 그렇습니다. 차이점은 이러한 매크로는 C 헤더 (C++에서 포함 된 경우) 및 C++ 헤더에서 조건없는 매크로입니다. –

관련 문제