학습자료(~2017)/C,C++

[C,C++] printf 사용시 포맷(fotmat) 지정에 관해 -(플래폼에 종속적이지 않은 printf)

단세포소년 2013. 4. 11. 11:30
반응형

printf 함수를 사용하다보면 난감한 상황에 봉착한다.

int64_t 의 경우 장비에 따라서 long long int, long int 등 기본형을 다르게 가진다.

또는 void * 즉 포인터형이 32비트 장비에서는 32비트 크기이고 , 64비트 장비에서는 64비트이다.

이런 경우 printf 의 포맷을 무엇으로 지정해야되는 고민스러울 때가 있다. 매크로 조건식으로 분기를 타게해야되나 sizeof 함수로 분기를 타게 해야되나. 고민스러울때가 많다.

이때 #include<inttypes.h> 를 활용해보자


만약 int64_t 를 정수로 출력해야된다면

printf("%" PRId64 , val)

만약 int64_t 를 16진수로 출력해야된다면

printf("%" PRIx64 , val)

만약 void * 즉 포인터(주소) 값을 정수 출력해야된다면

printf("%" PRIdPTR , val )

만약 void * 즉 포인터(주소) 값을 16진수 출력해야된다면

printf("%" PRIxPTR, val )

이런 식으로 써라. 


PRId64 를 inttypes.h 헤더에서 보면 

# define PRId64 __PRI64_PREFIX "d" 이렇게 구성되어있다.

장비에 따라 포맷의 형태가 지정되어 있다. 

다시 예를 들어 64비트 장비에서 "%" PRId64  은 "%" "l" "d"  이다. 

즉 %ld 이다. 


inttypes.h 를 활용하여 장비에 종속적이지 않게 printf 를 활용해보자.

아. c99 에서 size_t 는 printf 포맷이 %zu 로 지정되어있다.  printf("%zu",sizeof(val)) 이런 식을 활용해라.

http://www.cplusplus.com/reference/cstdio/printf/ 이곳에서 pfintf 기본 포멧을 확인해라.


글이 엉망이라 미안함..

반응형