source

플랫폼에 의존하지 않는 size_t 형식 지정자(c)

goodcode 2022. 7. 30. 18:28
반응형

플랫폼에 의존하지 않는 size_t 형식 지정자(c)

활자 변수를 출력하고 싶다.size_tC로 되어 있는데 그런 것 같아요.size_t는 아키텍처에 따라 다른 변수 유형에 에일리어스 됩니다.예를 들어 한 시스템(64비트)에서는 다음 코드가 경고를 발생시키지 않습니다.

size_t size = 1;
printf("the size is %ld", size);

그러나 다른 컴퓨터(32비트)에서는 위의 코드가 다음과 같은 경고 메시지를 생성합니다.

경고: 형식 '%ld'는 형식 'long int *'를 예상하지만 인수 3은 형식 'size_t *'을(를) 가집니다.

64비트 머신의 포인터 사이즈가 다르기 때문에size_t에일리어스입니다.long int("%ld"32비트 머신에서는size_t는 다른 타입에 에일리어스 되어 있습니다.

전용 포맷 지정자가 있습니까?size_t?

네: 를 사용합니다.z길이 한정자:

size_t size = sizeof(char);
printf("the size is %zu\n", size);  // decimal size_t ("u" for unsigned)
printf("the size is %zx\n", size);  // hex size_t

사용 가능한 기타 길이 수식자는 다음과 같습니다.hh(용)char),h(용)short),l(용)long),ll(용)long long),j(용)intmax_t),t(용)ptrdiff_t, 및L(용)long doubleC99 표준의 § 7.19.6.1(7)을 참조한다.

네, 있어요.그렇다.%zu(ANSI C99에 규정되어 있습니다.

size_t size = 1;
printf("the size is %zu", size);

주의:size_t서명되어 있지 않기 때문에%ld잘못된 길이 수식자와 잘못된 형식 변환 지정자가 이중으로 잘못되었습니다.혹시 궁금하실까 봐%zd을 위한ssize_t(서명이 되어 있습니다).

MSDN에 따르면 Visual Studio는 32비트 및 64비트 플랫폼에서 이식 가능한 코드에 대해 "I" 접두사를 지원한다고 합니다.

size_t size = 10;
printf("size is %Iu", size);

언급URL : https://stackoverflow.com/questions/2125845/platform-independent-size-t-format-specifiers-in-c

반응형