Platform independent size_t Format specifiers in c?

前提是你 提交于 2019-11-26 06:27:08

问题


I want to print out a variable of type size_t in C but it appears that size_t is aliased to different variable types on different architectures. For example, on one machine (64-bit) the following code does not throw any warnings:

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

but on my other machine (32-bit) the above code produces the following warning message:

warning: format \'%ld\' expects type \'long int *\', but argument 3 has type \'size_t *\'

I suspect this is due to the difference in pointer size, so that on my 64-bit machine size_t is aliased to a long int (\"%ld\"), whereas on my 32-bit machine size_t is aliased to another type.

Is there a format specifier specifically for size_t?


回答1:


Yes: use the z length modifier:

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

The other length modifiers that are available are hh (for char), h (for short), l (for long), ll (for long long), j (for intmax_t), t (for ptrdiff_t), and L (for long double). See §7.19.6.1 (7) of the C99 standard.




回答2:


Yes, there is. It is %zu (as specified in ANSI C99).

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

Note that size_t is unsigned, thus %ld is double wrong: wrong length modifier and wrong format conversion specifier. In case you wonder, %zd is for ssize_t (which is signed).




回答3:


MSDN, says that Visual Studio supports the "I" prefix for code portable on 32 and 64 bit platforms.

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


来源:https://stackoverflow.com/questions/2125845/platform-independent-size-t-format-specifiers-in-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!