2

我的公司正在从 C 慢慢转向 C++98。C++98 是 C 的超集,所以这应该不是问题,但确实如此。printf与 pedantic、警告标志和指定 32 位环境的代码结合使用时,无法打印 64 位固定宽度整数。

我需要打印的数字是uint64_t. 而且我了解使用PRIX64时的用法printf。但是,一旦在编译时添加了额外的标志,就会出现错误。

我查看了标题,看看是否有什么奇怪的地方,但一切看起来都很好。我不确定为什么在 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
4

1 回答 1

1

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

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

编译器似乎没有警告宏,大概是因为实现者没有退出关于检测预处理器以执行此类诊断。但是编译器非常友好,可以诊断非标准printf说明符的使用(宏在目标系统上扩展到的说明符)llxPRIX64

于 2019-05-02T23:24:06.647 回答