【问题标题】:What is the msvc compatible version of format specifier %qi?格式说明符 %qi 的 msvc 兼容版本是什么?
【发布时间】:2014-10-17 02:35:30
【问题描述】:

我正在移植一些 gcc 代码,遇到错误“表达式:(不正确的格式说明符),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

【问题讨论】:

  • 您可以在此处查找适合您的案例说明符:msdn.microsoft.com/en-us/library/hf4y5e3w.aspx
  • 如果您使用 %qi 提供有关您在 sprintf 中使用的内容的更多信息,这将为回答者提供更多信息。
  • 我还没有找到它,我怀疑它在某个地方的宏中
  • 我想我找到了,给我一点时间来弄清楚它是如何组合在一起的
  • 我想我也找到了等价物 - %I64i

标签: visual-c++ c99


【解决方案1】:

PRIi64(及其等效的PRId64)是用于 64 字节整数的跨平台 C99 格式说明符。

MSVC 不支持 C99,但它有自己的格式说明符 - "%I64d"(或 "%I64i",如果您更喜欢 i 而不是 d)。

您发布的头文件来源的旁注:这似乎是 GCC 的 inttypes.h,一个 C99 标准文件。这是它如何定义PRIi64

在 GCC 中,%q(扩展名)格式前缀表示“四边形”。它用于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 并将 GCC 的 %q 格式前缀替换为 MSVC 的 %I64 格式前缀:

#define __PRI_64_LENGTH_MODIFIER__ "I64"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-22
    • 2013-06-22
    • 1970-01-01
    • 2010-11-03
    • 2012-01-05
    • 2012-01-31
    • 2014-01-01
    • 1970-01-01
    相关资源
    最近更新 更多