【问题标题】:C++98 pedantic errors when using fixed width integers使用固定宽度整数时的 C++98 迂腐错误
【发布时间】:2019-05-02 22:24:50
【问题描述】:

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

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

我查看了标题,看看是否有什么奇怪的地方,但一切看起来都不错。我不确定为什么在 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 不是 C 的超集,尽管两者有一个足够大的共同子集来编程。
  • C++98 并不是任何 C 版本的真正超集。作为 C++98 标准 C 库一部分的 C 库接口是 子集 C99 库。但是stdio.hinttypes.h 都不是 C++ 标准的一部分。您应该使用cstdiocinttypes。 (但这可能没有任何区别。)
  • 警告意味着它所说的。 PRIX64 来自 C99。当然,C++98 不支持一年后才标准化的 C 特性。 C++11 有一些 C++98 没有的与 C 兼容的要求,包括这些宏。
  • 老实说,如果完全可以使用 C++11,那我会这样做。 C++11 有一些重大的生活质量改进,使编写 C++ 代码变得更容易,并且它还引入了移动语义和智能指针(这使得在编写合理代码的同时更容易避免复制大块数据)

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 2012-04-30
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 2014-08-17
    相关资源
    最近更新 更多