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

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

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

我需要打印的数字类型为uint64_t。我了解使用 printfPRIX64 的用法。然而,一旦编译时添加了额外的标志,错误就会随之而来。

我查看了标题,看看是否有任何奇怪的地方,但看起来一切都很好。我不知道为什么使用这个组合在 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 说明符的使用情况(PRIX64 宏在目标上扩展为 llx 说明符系统)。

关于使用固定宽度整数时的 C++98 迂腐错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55961014/

相关文章:

c++ - CMake 中的 OpenCV 和 Gtest 冲突

Java Keytool jdk/jre 64/32bit - 有区别吗?

c - 当我运行 C 程序时,我的编译器返回 "assignment to ' int *' from incompatible pointer type ' char *' [-Wincompatible-pointer-types]"

c++ - 如何在 gcc 中为未使用的 lambda 表达式启用警告?

c++ - 当 Visual Studio 运行正常时, vector 迭代器上的 LInux g++ 编译器错误

c++ - 在 C++03 中初始化成员的替代方法

windows - 我应该提供我的应用程序的 x64 版本吗?

windows - 从 32 位 Windows 应用启动 64 位可执行文件

c++ - 忽略警告 "-Wunused-result"

c++ - Boost asio网络分离发送和接收