C++ 如何打印uint64\t?不符合以下条件:“;伪尾随‘;%’;格式为“;

C++ 如何打印uint64\t?不符合以下条件:“;伪尾随‘;%’;格式为“;,c++,c,C++,C,我编写了一个非常简单的printfuint64\t测试代码: #include <inttypes.h> #include <stdio.h> int main() { uint64_t ui64 = 90; printf("test uint64_t : %" PRIu64 "\n", ui64); return 0; } ISO C99标准规定,只有在明确请求时才必须定义这些宏 #define __STDC_FORMAT_MACROS #include

我编写了一个非常简单的printfuint64\t测试代码:

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

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

ISO C99标准规定,只有在明确请求时才必须定义这些宏

#define __STDC_FORMAT_MACROS
#include <inttypes.h>

... now PRIu64 will work
\define\u STDC\u FORMAT\u宏
#包括
... 现在PRIu64可以工作了

在Centos 5.x下编译memcached时,我遇到了同样的问题

解决方案是将gcc和g++至少升级到4.4版


在编译之前确保您的cc/cxx设置为(导出)到右二进制文件。

,因为您已经包含了C++标签,您可以使用并避免<代码> PrU64 64 < /C>宏和其他<代码> Prtff < /C>问题:
#include <fmt/core.h>

int main() {
  uint64_t ui64 = 90;
  fmt::print("test uint64_t : {}\n", ui64);
}
#包括
int main(){
uint64_t ui64=90;
fmt::打印(“测试uint64:{}\n”,ui64);
}
基于此库的格式化工具是为了在C++20中实现标准化而提出的:


免责声明:我是{fmt}的作者。

@Dan,如果答案解决了您的问题,请不要忘记将答案标记为已接受(单击左侧的复选标记图像)。嗯,包括标题就足够了。在C++中,代码< >代码>C++中的代码> > StdcCyFrimaMy宏< /C>只出现在C99的脚注中,这表明C++只在请求的存在下定义这些宏。然而,C++委员会选择忽略该建议:例如,在N3242草案中,27.92/3:注意:定义的宏是无条件提供的。特别地,C标准的脚注182中提到的符号y*STdcFualATMULTS在C++中没有任何作用。所以当编译器赶上时,我们不需要C++或C++中的<代码> John Marshall。G++4.7.3看起来需要宏,甚至当被包含时。@埃里克:显然G+4.7.3没有赶上!事实上,您可能正在将其与早于的glibc版本一起使用。正如glibc报告中所讨论的,您的g++4.7.3的libstdc++有代码来解决这个问题。如果你用<代码> -STD= C++ +0x编译,也许包括,而不是,我相信它将提供格式宏,而不提供C++代码。如果您将文件重命名为
main.c
,并使用gcc编译,则所有文件都应该可以正常工作。同样,没有错误:使用gcc或clang时,最好指定
-std=c11
或您使用的标准版本。捕获此错误和其他错误。我还建议至少使用
-Wall-Wextra-Wpedantic-Wconversion
。酷!它是否也与sscanf类似?很可能。我们正在调查更换
scanf
的可能性。太好了!另外,我想知道是否有一个独立于语言环境和/或可选择语言环境的版本的进展。cppreference页面仍然只链接到,这并不是人们真正需要的。我想知道
fmt
和/或c++20是否处理它。
std::to_string
可能会保持原样,但
std::format
允许您控制是否使用区域设置(默认情况下它不使用区域设置)。
#include <fmt/core.h>

int main() {
  uint64_t ui64 = 90;
  fmt::print("test uint64_t : {}\n", ui64);
}