是否在printf格式的字符串中使用%zu正确的语法,如Wikipedia上的某些C代码所示?

问题描述 投票:7回答:5

我刚刚在Wikipedia上找到了此代码。链接:http://en.wikipedia.org/wiki/Sizeof#Use

代码:

/* the following code illustrates the use of sizeof 
 * with variables and expressions (no parentheses needed),
 * and with type names (parentheses needed)
 */

char c;

printf("%zu,%zu", sizeof c, sizeof(int));

它指出:“应该使用z前缀来打印它,因为实际大小在每种体系结构上都可能不同。”

我在编译器上尝试过,但是得到以下结果:

zu,zu
c printf sizeof
5个回答
7
投票
是,语法正确(至少对于C99)。看起来您的编译器没有设置为可以处理它。只需取出z,您可能会没事的。为正确起见,请确保您的printf格式说明符与类型的大小匹配。在这方面,打开编译器会给您的所有警告可能会有所帮助。

您的报价:

应该使用z前缀来打印它,因为实际大小在每种体系结构上都可能不同

指的是size_t(由sizeof运算符返回的类型)可以随体系结构而变化的事实。 z旨在使您的代码更具可移植性。但是,如果您的编译器不支持它,那将无法解决。只需摆弄%u%lu等的组合,直到获得有意义的输出为止。


6
投票
z长度修饰符已添加到C99标准中的C;您可能有一个不支持C99的编译器。

如果您的C编译器不支持,则可以将大小视为无符号长:

printf("%lu,%lu", (unsigned long)sizeof c, (unsigned long)sizeof(int));


2
投票
是,但是仅适用于C99兼容的编译器。从wikipedia

z:对于整数类型,使printf期望使用size_t大小的整数参数。

1
投票
[您是否告诉编译器您想要C99大脑思考?可能有一个开关可以做到这一点。例如,-std=c99为gcc。

[如果您的编译器不支持它,但是您知道其他人会支持,则可以解决PRId64样式(免责声明-PSEUDO CODE AHEAD ..:]]]

#ifdef __SOME_KNOWN_C99_COMPILER #define PORTUNSIGNED "zu" #else #define PORTUNSIGNED "u" #endif printf("%-11" PORTUNSIGNED " ways to skin a cat\n");

但是,获得对c99具有功能支持的编译器可能更好。

0
投票
我已经使用gcc 4.0进行了测试。它适用于-std=c99
© www.soinside.com 2019 - 2024. All rights reserved.