在移植一些gcc代码时,遇到一个错误"Expression:(不正确的格式说明符),0"。我检查了传递给sprintf(由我定义)和它的%qi的内容。从我在谷歌看到的,它是某种c99的东西。msvc兼容的版本是什么(如果有的话)?
说明符的用法如下:
(void)snprintf(val, 64, "%"PRIi64, node_data->intval);
和定义:(在项目附带的inttypes.h中)
#define __PRI_64_LENGTH_MODIFIER__ "q"
#define PRIi64 __PRI_64_LENGTH_MODIFIER__ "i"
node_data->intval似乎是uint64_t
PRIi64
(及其等价的PRId64
)是用于64字节整数的跨平台C99格式说明符。
MSVC不支持C99,但是它有自己的格式说明符——"%I64d"
(或者"%I64i"
,如果你喜欢i
而不是d
)。
关于你发布的头文件来源的旁注:这似乎是GCC的inttypes.h
,一个c99标准文件。下面是它如何定义PRIi64
:
在GCC中,%q
(扩展)格式前缀表示"quad"。它用于quad_t
GCC类型,它被定义为typedef long long int quad_t;
(无符号版本:typedef unsigned long long int u_quad_t;
)。它可以与标准数字格式一起使用:"%qd %qi %qo %qu %qx %qX %qn"
.
如果你想减少对代码本身的更改,你可以修改你正在使用的头文件中的#define
,并用MSVC的%I64
格式前缀替换GCC的%q
格式前缀:
#define __PRI_64_LENGTH_MODIFIER__ "I64"