使用固定宽度整数时的 C++98 迂腐错误
C++98 pedantic errors when using fixed width integers
我的公司正在慢慢地从 C 迁移到 C++98。 C++98 是 C 的超集,所以这应该不是问题,但确实如此。使用 printf
打印 64 位 fixed-width 整数在与迂腐、警告标志和 32 位环境指定代码结合使用时不起作用。
我要打印的数字是uint64_t
类型的。我理解 PRIX64
在使用 printf
时的用法。但是编译的时候只要加上额外的flags,就会报错
我查看了 headers 是否有任何奇怪的地方,但看起来一切都很好。我不确定为什么使用这种组合在 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_t
或 PRIX64
(也没有 llx
)。这些是在 C++11 中引入到 C++ 中的(旁注:它们在 C99 标准之前也不在 C 中)。
这些宏可能碰巧起作用,因为它们是由标准库提供的,标准库可能支持更新的标准,并且不会特意阻止旧代码使用新功能。但它们不能保证有效
编译器似乎没有对宏发出警告,这大概是因为实施者没有退出对预处理器进行检测以执行此类诊断。但是编译器足够友好,可以诊断非标准 printf
说明符的使用(llx
说明符,PRIX64
宏在您的目标系统上扩展到)。
我的公司正在慢慢地从 C 迁移到 C++98。 C++98 是 C 的超集,所以这应该不是问题,但确实如此。使用 printf
打印 64 位 fixed-width 整数在与迂腐、警告标志和 32 位环境指定代码结合使用时不起作用。
我要打印的数字是uint64_t
类型的。我理解 PRIX64
在使用 printf
时的用法。但是编译的时候只要加上额外的flags,就会报错
我查看了 headers 是否有任何奇怪的地方,但看起来一切都很好。我不确定为什么使用这种组合在 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_t
或 PRIX64
(也没有 llx
)。这些是在 C++11 中引入到 C++ 中的(旁注:它们在 C99 标准之前也不在 C 中)。
这些宏可能碰巧起作用,因为它们是由标准库提供的,标准库可能支持更新的标准,并且不会特意阻止旧代码使用新功能。但它们不能保证有效
编译器似乎没有对宏发出警告,这大概是因为实施者没有退出对预处理器进行检测以执行此类诊断。但是编译器足够友好,可以诊断非标准 printf
说明符的使用(llx
说明符,PRIX64
宏在您的目标系统上扩展到)。