[c] printf 패밀리를 사용하여 size_t 변수를 이식 가능하게 인쇄하는 방법은 무엇입니까?

유형의 변수가 size_t있으며를 사용하여 인쇄하고 싶습니다 printf(). 이식 가능하게 인쇄하기 위해 어떤 형식 지정자를 사용합니까?

32 비트 시스템에서는 %u옳아 보입니다. 나는로 컴파일했고 g++ -g -W -Wall -Werror -ansi -pedantic경고는 없었다. 그러나 64 비트 컴퓨터에서 해당 코드를 컴파일하면 경고가 발생합니다.

size_t x = <something>;
printf("size = %u\n", x);

warning: format '%u' expects type 'unsigned int', 
    but argument 2 has type 'long unsigned int'

내가로 변경하면 경고가 예상대로 사라집니다 %lu.

문제는 코드를 작성하여 32 비트 및 64 비트 컴퓨터에서 무료로 경고를 컴파일하는 방법입니다.

편집 : 해결 방법으로, 하나의 대답은 변수를 충분히 큰 정수로 캐스트 unsigned long하고,를 사용하여 인쇄하는 것 %lu입니다. 그것은 두 경우 모두 작동합니다. 다른 아이디어가 있는지 찾고 있습니다.



답변

z수정자를 사용하십시오 .

size_t x = ...;
ssize_t y = ...;
printf("%zu\n", x);  // prints as unsigned decimal
printf("%zx\n", x);  // prints as hex
printf("%zd\n", y);  // prints as signed decimal


답변

사용중인 컴파일러 (블리치)에 따라 다릅니다.

… 물론 C ++를 사용 하는 경우 AraK에서 제안한cout 대로 대신 사용할 수 있습니다 .


답변

C89의 %lu경우 값을 사용 하여 다음으로 캐스팅하십시오 unsigned long.

size_t foo;
...
printf("foo = %lu\n", (unsigned long) foo);

C99 이상의 경우 다음을 사용하십시오 %zu.

size_t foo;
...
printf("foo = %zu\n", foo);


답변

Windows에 대한 Adam Rosenfield의 답변을 확장합니다.

VS2013 업데이트 4 및 VS2015 미리보기 에서이 코드를 테스트했습니다.

// test.c

#include <stdio.h>
#include <BaseTsd.h> // see the note below

int main()
{
    size_t x = 1;
    SSIZE_T y = 2;
    printf("%zu\n", x);  // prints as unsigned decimal
    printf("%zx\n", x);  // prints as hex
    printf("%zd\n", y);  // prints as signed decimal
    return 0;
}

VS2015는 이진 출력을 생성했습니다.

1
1
2

VS2013에 의해 생성 된 것은 말합니다 :

ZZ
ZD
ZD

참고 : ssize_tPOSIX 확장이며 Windows Data TypesSSIZE_T 와 비슷한 것이므로 참조를 추가했습니다 .<BaseTsd.h>

또한 다음 C99 / C11 헤더를 제외하고 모든 C99 헤더는 VS2015 미리보기에서 사용할 수 있습니다.

C11 - <stdalign.h>
C11 - <stdatomic.h>
C11 - <stdnoreturn.h>
C99 - <tgmath.h>
C11 - <threads.h>

또한 C11 <uchar.h>은 이제 최신 미리보기에 포함됩니다.

자세한 내용은이 참조 기존새로운 표준 적합성에 대한 목록을.


답변

C99 확장을 반드시 지원하지 않는 C ++에서이 작업을 수행하는 사람들은 boost :: format을 진심으로 권장합니다. 이것은 size_t 유형의 크기 질문을 혼란스럽게 만듭니다.

std::cout << boost::format("Sizeof(Var) is %d\n") % sizeof(Var);

boost :: format에는 크기 지정자가 필요하지 않으므로 값을 표시하려는 방법에 대해서만 걱정할 수 있습니다.


답변

std::size_t s = 1024;
std::cout << s; // or any other kind of stream like stringstream!


답변

printf("size = %zu\n", sizeof(thing) );