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 기본 포멧을 확인해라.
글이 엉망이라 미안함..
'학습자료(~2017) > C,C++' 카테고리의 다른 글
시간 (time) 함수에 대한 고찰 mktime , strptime, time zone , UTC , KST (1) | 2013.04.15 |
---|---|
Coroutines in C (코루틴) (0) | 2013.03.26 |
[MYSQL] 간단 사용법 예제코드 (0) | 2012.08.20 |
[GCC]gcc 컴파일 옵션 (0) | 2012.08.13 |
[C] #if 0 ,#if 1 의 사용의도 (0) | 2012.03.29 |