플랫폼 독립적 인 size_t c의 형식 지정자?


86

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있습니까?


1
경고 메시지가 코드와 일치하지 않습니다. 경고에는 포인터가 언급되어 있지만 코드에는 아무것도 없습니다. &어딘가에서 일부를 제거 했습니까 ?
Jens

포인터? 아니요, 포인터에 대한 경고를받지 못합니다. 실제로 어떤 컴퓨터에서 해당 코드를 실행하는지에 따라 때때로 경고가 전혀 표시되지 않습니다. 다음 테스트 코드를 시도해보십시오. #include <stdio.h> int main () {size_t size = 1; printf ( "크기는 % ld", 크기); 반환 0; }
에단 헤일


1
@EthanHeilman 그는 당신의 경고가 말을한다는 사실을 언급거야 warning: format '%ld' expects type 'long int *', but argument 3 has type 'size_t *'아마 때 해야 말하는 warning: format '%ld' expects type 'long int', but argument 3 has type 'size_t'. scanf()이러한 경고를 받았을 때 대신 사용하고 있었습니까 ?
RastaJedi

답변:


123

예 : 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(for char), h(for short), l(for long), ll(for long long), j(for intmax_t), t(for ptrdiff_t) 및 L(for long double)입니다. C99 표준의 §7.19.6.1 (7)을 참조하십시오.


zd와 zu의 차이점은 무엇입니까? 나는 zd가 십진수라는 것을 알지만 서명되어 있다면 zd가 서명되는 것은 어떤 영향을 미칩니다.
Ethan Heilman

1
a size_t와 an 의 차이입니다 ssize_t. 후자는 거의 사용되지 않습니다.
Adam Rosenfield

26
맞습니다.이 경우 %zu에는 인수가 서명되지 않았기 때문에 를 사용해야합니다 .
caf

사용 가능한 다른 옵션은 printf 매뉴얼 페이지에 설명되어 있습니다 : linux.die.net/man/3/printf
INS

9
@detly : 아니요, z길이 수정자는 C89 / C90의 일부가 아닙니다. C89 호환 코드를 목표로하는 경우 최선의 unsigned long방법은 l길이 수정자를 대신 사용하는 것입니다 printf("the size is %lu\n", (unsigned long)size);. C89와 size_t보다 큰 시스템을 모두 지원하는 long것은 까다 롭고 여러 전 처리기 매크로를 사용해야합니다.
아담 로젠

45

네, 있습니다. 그것은이다 %zu(ANSI C99에 지정된대로).

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

참고 size_t따라서, 서명되지는 %ld길이의 잘못 수정 및 잘못된 형식 변환 지정자 : 두 번 잘못입니다. 궁금한 %zd점이 있으시면 for ssize_t(서명)입니다.


1

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

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

6
이 플랫폼 독립적이지 그래서 그것은 표준 부합되지 않는 MS의 특정의
phuclv

@phuclv 맞습니다. 그리고 그것이 정말로-대답에서 알 수 있듯이- '휴대용'이라고 말하면 내가 MS에 대해 아는 것보다 훨씬 더 나쁩니다. 저를 놀라게하는 것은 아닙니다. 누군가 무언가를 시도하고 대답하려고 노력했기 때문에 저는 반대표를 던지는 사람이 아닙니다. 그러나 여전히이 대답은 틀 렸습니다. 아, 여기 '휴대용'이라는 아이디어를 이해 한 것 같아요. 32 비트와 64 비트 모두에서 작동한다고 말해야합니다. 물론 그럴 것입니다.
Pryftan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.