使用固定宽度整数时的 C++98 迂腐错误

C++98 pedantic errors when using fixed width integers

我的公司正在慢慢地从 C 迁移到 C++98。 C++98 是 C 的超集,所以这应该不是问题,但确实如此。使用 printf 打印 64 位 fixed-width 整数在与迂腐、警告标志和 32 位环境指定代码结合使用时不起作用。

我要打印的数字是uint64_t类型的。我理解 PRIX64 在使用 printf 时的用法。但是编译的时候只要加上额外的flags,就会报错

我查看了 headers 是否有任何奇怪的地方,但看起来一切都很好。我不确定为什么使用这种组合在 C 中有效,但在 C++ 中无效。解决这个问题的正确方法当然是开始使用std::cout,但是要编辑的代码太多了,一次完成是不可行的。

下面显示的最小示例 (print.cpp):

#include <stdio.h>

#define __STDC_FORMAT_MACROS
#include <inttypes.h>

int main()
{
  uint64_t num = 0x0;
  printf("num is %" PRIX64"\n", num);

  return 0;
}

用于编译它的命令:

g++ print.cpp -o print  --std=c++98 -Wall -m32 --pedantic

预期结果:没有错误,打印了数字。 结果:

warning: ISO C++ does not support the ‘ll’ gnu_printf length modifier

C++98 没有 uint64_tPRIX64(也没有 llx)。这些是在 C++11 中引入到 C++ 中的(旁注:它们在 C99 标准之前也不在 C 中)。

这些宏可能碰巧起作用,因为它们是由标准库提供的,标准库可能支持更新的标准,并且不会特意阻止旧代码使用新功能。但它们不能保证有效

编译器似乎没有对宏发出警告,这大概是因为实施者没有退出对预处理器进行检测以执行此类诊断。但是编译器足够友好,可以诊断非标准 printf 说明符的使用(llx 说明符,PRIX64 宏在您的目标系统上扩展到)。