유형의 변수가 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
답변
사용중인 컴파일러 (블리치)에 따라 다릅니다.
- gnu는
%zu
(또는%zx
, 또는%zd
서명 된 것처럼 표시합니다.) - 마이크로 소프트는 말한다
%Iu
(또는%Ix
, 또는%Id
만 (비주얼 스튜디오 2015 년) CL V19의로, 마이크로 소프트의 지원이 – 그러나 다시의 등, 서명 한)%zu
(볼 이 응답 에 이 댓글을 )
… 물론 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_t
POSIX 확장이며 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) );
