C++ C++;98使用固定宽度整数时的迂腐错误
我的公司正在慢慢地从C转向C++98。C++98是C的超集,所以这应该不是问题,但确实是。当与迂腐、警告标志和为32位环境指定代码结合使用时,使用C++ C++;98使用固定宽度整数时的迂腐错误,c++,32bit-64bit,gcc-warning,c++98,gcc-pedantic,C++,32bit 64bit,Gcc Warning,C++98,Gcc Pedantic,我的公司正在慢慢地从C转向C++98。C++98是C的超集,所以这应该不是问题,但确实是。当与迂腐、警告标志和为32位环境指定代码结合使用时,使用printf打印64位固定宽度整数不起作用 我需要打印的数字类型为uint64\u t。我了解使用printf时使用PRIX64。但是,一旦在编译时添加了额外的标志,就会出现错误 我看了一下标题,看看有没有什么奇怪的地方,但看起来都不错。我不知道为什么使用这个组合在C中工作,而不是C++。当然,解决这个问题的正确方法是开始使用std::cout,但是有
printf
打印64位固定宽度整数不起作用
我需要打印的数字类型为uint64\u t
。我了解使用printf
时使用PRIX64
。但是,一旦在编译时添加了额外的标志,就会出现错误
我看了一下标题,看看有没有什么奇怪的地方,但看起来都不错。我不知道为什么使用这个组合在C中工作,而不是C++。当然,解决这个问题的正确方法是开始使用std::cout
,但是有太多的代码需要编辑,一次完成这一切是不可行的
下面显示的最小示例(print.cpp):
预期结果:无错误,已打印编号。
结果:
C++98没有
uint64\u t
或PRIX64
(也没有llx
)。这些被引入C++ 11中的C++(边注:它们不是C,直到C99标准)。
这些宏可能碰巧可以工作,因为它们是由标准库提供的,标准库可能支持较新的标准,并且不会特意阻止旧代码使用新功能。但它们并不能保证起作用
编译器似乎没有对宏发出警告,可能是因为实现者没有退出检测预处理器以执行此类诊断。但是编译器非常友好,可以诊断非标准的
printf
说明符(在目标系统上扩展到的PRIX64
宏的llx
说明符)的使用情况。类似于C++98不是C的超集,虽然两者有一个足够大的公共子集,可以在C++中编程。C++98实际上不是任何C版本的超集。C++98标准C库中的C库接口是C99库的子集。但是,无论是< C++ > STDIO。您应该使用cstdio
和cinttypes
。(但这可能没有什么区别。)警告的意思是它所说的<代码>PRIX64来自C99。当然,C++98不支持一年后才标准化的C特性。C++11有一些C++98所没有的与C的兼容性要求,包括这些宏。老实说,如果可以使用C++11,那就是我想要的。C++ 11有一些主要的生命质量改进,使编写C++代码更容易,同时也引入了移动语义和智能指针(这使得在编写敏感代码时避免复制大数据块更容易)。
#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