如何printf uint64_t?失败:"格式中的虚假尾随'%'

Dan*_*Dan 132 c c++

我写了一个非常简单的printf uint64_t测试代码:

#include <inttypes.h>
#include <stdio.h>

int main()
{
  uint64_t ui64 = 90;
  printf("test uint64_t : %" PRIu64 "\n", ui64);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我使用ubuntu 11.10(64位)和gcc版本4.6.1进行编译,但失败了:

main.cpp: In function ‘int main()’:
main.cpp:9:30: error: expected ‘)’ before ‘PRIu64’
main.cpp:9:47: warning: spurious trailing ‘%’ in format [-Wformat]
Run Code Online (Sandbox Code Playgroud)

Wil*_*ill 162

ISO C99标准规定只有在明确请求时才能定义这些宏.

#define __STDC_FORMAT_MACROS
#include <inttypes.h>

... now PRIu64 will work
Run Code Online (Sandbox Code Playgroud)

  • @Jens:的确如此; `_STDC_FORMAT_MACROS`只出现在C99的脚注中,表明C++只在有请求的情况下定义这些宏.然而,C++委员会选择忽略该建议:例如在n3242草案中,27.9.2/3:_注意:<cinttypes>定义的宏是无条件提供的.特别是,C标准脚注182中提到的符号__STDC_FORMAT_MACROS在C++中没有任何作用.所以当编译器赶上时,我们在C或C++中都不需要`__STDC_FORMAT_MACROS`. (14认同)
  • 嗯,只包括标题就足够了.只有包含在C++中才需要`__STDC_FORMAT_MACROS`宏. (9认同)
  • @Eric:显然g ++ 4.7.3还没有赶上!事实上,可能你正在使用glibc版本,这个版本早于[此错误修复](http://sourceware.org/bugzilla/show_bug.cgi?id=15366).正如glibc报告中所讨论的,你的g ++ 4.7.3的libstdc ++有代码来解决这个问题.如果使用`-std = c ++ 0x`编译并且可能是#include <cinttypes>而不是<inttypes.h>,我相信它会提供格式宏而不提供`__STDC_FORMAT_MACROS`. (4认同)
  • @John Marshall g ++ 4.7.3似乎需要宏,即使包含<inttypes.h>. (3认同)