【发布时间】: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.h和inttypes.h都不是 C++ 标准的一部分。您应该使用cstdio和cinttypes。 (但这可能没有任何区别。) -
警告意味着它所说的。
PRIX64来自 C99。当然,C++98 不支持一年后才标准化的 C 特性。 C++11 有一些 C++98 没有的与 C 兼容的要求,包括这些宏。 -
老实说,如果完全可以使用 C++11,那我会这样做。 C++11 有一些重大的生活质量改进,使编写 C++ 代码变得更容易,并且它还引入了移动语义和智能指针(这使得在编写合理代码的同时更容易避免复制大块数据)
标签: c++ 32bit-64bit gcc-warning c++98 gcc-pedantic