C++/C中的int32_t和printf格式:%d还是%ld?

13
在一些平台上,int32_t(来自于stdint.h)是long int,但在另一些平台上,它可能是int。当我想使用printf函数时,我该如何确定应该使用哪个格式:"%ld"还是"%d"
或者,也许我应该像下面这样强制转换为长整型:
int32_t m;
m = 3;
printf ("%ld\n", (long)m);

但那个解决方法很繁琐,你有什么建议吗?


2
你使用C还是C++?在C++中,你可以使用%sto_stringstd::cout一起使用。 - xuhdev
1
@M.M:对于 int64_t 的处理方式与 int32_t 相同,且移植起来很简单。重复问题是有效的。为每个 stdint.h 类型单独提出一个问题是无意义的。 - too honest for this site
1
@Olaf 32位和64位是不同的。OP询问了两种语言,这有时是值得怀疑的,但在这种情况下,两种语言的答案几乎相同。你认为别人是否“需要使用C ++”是无关紧要的。 - M.M
1
@jww:显然,我们需要为stdint.h类型单独提出一个问题。对于scanf也是如此... - too honest for this site
3
@jww 是的,我也受够了。关于SO,最常见的抱怨是问题被恶意修改和过度热衷于关闭重复问题。还有对新用户的敌意。 - M.M
显示剩余11条评论
1个回答

22

在 C 语言中(自 C99 开始),inttypes.h 头文件包含一些宏,可以扩展为固定宽度类型的格式说明符。对于 int32_t

printf("%" PRId32 "\n", m);

那个宏可能会扩展为"d""ld"。您可以放置常规的修饰符等,例如:

printf("%03" PRId32 "\n", m);

在C++中(自C++11起),可以使用#include <inttypes.h>#include <cinttypes>实现相同的功能。

显然,一些C++实现要求用户在#include <inttypes.h>之前编写#define __STDC_FORMAT_MACROS 1,尽管C++标准规定不需要。


注意:如果您在包含“inttypes.h”之前定义了#define __STDC_FORMAT_MACROS 1,则宏仅适用于C ++,至少根据标准是这样的(某些编译器无论如何都会提供它们)。 - ShadowRanger
根据C99、C11标准,以及C++11和C++14标准规定,它们在C和C++中是强制的。也许您指的是C99中的注脚182(C99+TC3中的注脚191)。但是,C标准的注释对于C甚至其他语言都不具有规范性! - M.M
啊,没有注意到这个区别。话虽如此,我知道几个版本的GCC的g++(不确定最近的版本)肯定需要这个定义,所以可移植的代码应该定义它以确保正确。 - ShadowRanger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接