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

时间:2019-05-02 22:24:50

标签: c++ 32bit-64bit gcc-warning c++98 gcc-pedantic

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

我需要打印的数字是uint64_t类型。而且我了解使用PRIX64printf的用法。但是,一旦在编译时添加了额外的标志,就会产生错误。

我看了看表头,看是否有什么奇怪的东西,但是看起来都不错。我不知道为什么在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

1 个答案:

答案 0 :(得分:1)

C ++ 98没有uint64_tPRIX64。这些是在C ++ 11中引入C ++的(注:它们直到C99标准才在C中出现)。

这些宏可能偶然巧合地工作,因为它们是由标准库提供的,该库大概支持较新的标准,并且不会竭尽全力防止较旧的代码使用新功能。但是他们不能保证能正常工作

估计编译器似乎没有警告宏,因为实现者并未退出有关对预处理器进行检测以执行此类诊断的工作。但是编译器足够友好,可以诊断使用非标准的printf指定符(llx宏在目标系统上扩展到的PRIX64指定符)。