2016-10-23 6 views
3

에서 size_t로는 코드의 다음 코드가 있다고 가정 :를 인쇄 OS에 독립적 인 아키텍처 독립적 인 방법

include <stdio.h> 
size_t nodeID = 5; 
printf("nodeID = %lu", nodeID); 

이 경고없이 실행은 64 비트 시스템에서 제기되고를하지만 %를 변환 경고를 생성합니다 32 비트 시스템에서 루.

우리는 그러나이가 "I"수정을 사용하여 비주얼 스튜디오에서 작동하지 않는 %z modifier

를 사용하여 처리 할 수 ​​있습니다.

아키텍처 독립적이며 OS 독립적 인 방식으로이 문제를 해결할 수있는 방법이 있습니까? 당신이 IIRC이 오래된 MS 컴파일러와의 호환성 문제가 발생할 수 말한대로하지만

#include <stdio.h> 
size_t nodeID = 5; 
printf("nodeID = %zu\n", nodeID); 

: 당신이 말하는 것처럼

+0

'nodeID'가 모든 CPU 환경에서 동일한 크기를 갖는 것이 더 좋지 않을까요? 'uint64_t' 또는'uint32_t'라고 선언하면 x86 및 x64에서 다르게 실행되는 것을 원하지 않으면 프로그램이 동작을 변경하지 않습니다. –

+0

10 분할로 나만의 인쇄 방법을 쓸 수 있습니다. –

+2

''% zu ''형식은 표준적이고 독립적 인 방식으로되어 있습니다. 불행히도 Visual Studio C 컴파일러는 다음 표준을 오랫동안 건너 뛰어야합니다. 마지막 몇 가지 릴리스 (2013 및 2015)에는 전체 C99 호환성이 있어야합니다. –

답변

5

, 당신은 z 수정을 사용할 수 있습니다. 당신은 같은과 함께이 문제를 해결받을 수 있습니다 : 그것은 당신의 파일에 조건 처리기 매크로에 의존하지 않는다는 의미에서 독립적 인 아키텍처 및 OS입니다

#ifdef _MSC_VER /* Untested MSC detection */ 
#define PRIuSIZE Iu 
#else 
#define PRIuSIZE zu 
#endif 
#define QUOTE(name) #name 
#define STR(macro) QUOTE(macro) 
#define USIZE_STR STR(PRIuSIZE) 

#include <stdio.h> 
size_t nodeID = 5; 
printf("nodeID = %" USIZE_STR "\n", nodeID); 

또 다른 방법은, 다음과 같습니다

#include <stdio.h> 
#include <inttypes.h> 
size_t nodeID = 5; 
printf("nodeID = %" PRIu64 "\n", (uint64_t) nodeID); 

이것은 분명히 size_t가 작거나 내가 항상 믿고 길이가 64 비트와 동일한되는에 의존하는 것이다.

+1

"... 항상 그렇다고 믿습니다." - 믿는 것은 프로그래밍에 대한 나쁜 조언자입니다. 상한은 없습니다. '% zu'가 없으면 완전히 호환되지 않습니다. 그래서'% zu'가 도입되었습니다. – Olaf

+1

'size_t '는'uintmax_t'보다 클 수 없기 때문에'uintmax_t'를 강요하고'PRIuMAX'를 사용하여 올바른 형식 문자를 얻을 수 있습니다.그러나 만약 당신이''헤더와'uintmax_t'를 가지고 있다면'% zu'도 사용할 수있는 가능성이 높습니다. 비슷한 코멘트가'uint64_t'에도 적용됩니다. –