用于打印 size_t 值的便携式代码?
Portable code for printing size_t values?
我正在使用看起来像
的 C 代码片段
char buf[16];
size_t i = 6;
sprintf(buf, "%d", i);
...当函数需要 'int'.
时,编译器警告我第三个参数是 'size_t' 类型
所以我试着告诉它它将得到一个无符号整数
sprintf(buf, "%u", i);
现在编译器警告我第三个参数是 'size_t' 类型,而函数期望 'unsigned int'.
根据我在其他 questions/answers 上读到的关于这个问题的内容,我不能假设 size_t 是一个无符号整数,这解释了警告。
- 那么我怎样才能重写该行以使编译器满意
(即编译器保持沉默)?
编辑:
在有人提出建议之前,我正在寻找一种解决方案,该解决方案实际上可以解决出现问题的微小可能性。所以通过
强制类型转换
sprintf(buf, "%d", (int)i);
或
sprintf(buf, "%u", (unsigned int)i);
不受欢迎。
C99 和 C11 需要一个 z
修饰符:
sprintf(buf, "%zu", i);
如果 MS Visual Studio 也必须容纳,生活可能会更艰难(因为它不符合 C99 或 C11 标准)。根据 MSDN,您需要使用 I
而不是 z
。
我正在使用看起来像
的 C 代码片段char buf[16];
size_t i = 6;
sprintf(buf, "%d", i);
...当函数需要 'int'.
时,编译器警告我第三个参数是 'size_t' 类型所以我试着告诉它它将得到一个无符号整数
sprintf(buf, "%u", i);
现在编译器警告我第三个参数是 'size_t' 类型,而函数期望 'unsigned int'.
根据我在其他 questions/answers 上读到的关于这个问题的内容,我不能假设 size_t 是一个无符号整数,这解释了警告。
- 那么我怎样才能重写该行以使编译器满意 (即编译器保持沉默)?
编辑:
在有人提出建议之前,我正在寻找一种解决方案,该解决方案实际上可以解决出现问题的微小可能性。所以通过
强制类型转换sprintf(buf, "%d", (int)i);
或
sprintf(buf, "%u", (unsigned int)i);
不受欢迎。
C99 和 C11 需要一个 z
修饰符:
sprintf(buf, "%zu", i);
如果 MS Visual Studio 也必须容纳,生活可能会更艰难(因为它不符合 C99 或 C11 标准)。根据 MSDN,您需要使用 I
而不是 z
。