C++ %llx格式说明符:无效警告?

C++ %llx格式说明符:无效警告?,c++,c++11,g++,C++,C++11,G++,编辑以删除第一条警告 以下代码在mingw32下的g++4.4.0中正常工作: #include <cstdio> int main() { long long x = 0xdeadbeefc0defaceLL ; printf ("%llx\n", x) ; } 这与%lld相同。这在新版本中是固定的吗 再次编辑以添加: 如果我指定-std=c++0x,警告不会消失,即使(I)long是标准类型,并且(ii)%lld和%llx似乎得到了官方支持。例如,从21.5数

编辑以删除第一条警告

以下代码在mingw32下的g++4.4.0中正常工作:

#include <cstdio>
int main()
  {
  long long x = 0xdeadbeefc0defaceLL ;
  printf ("%llx\n", x) ;
  }
这与
%lld
相同。这在新版本中是固定的吗

再次编辑以添加:
如果我指定
-std=c++0x
,警告不会消失,即使(I)
long
是标准类型,并且(ii)
%lld
%llx
似乎得到了官方支持。例如,从21.5数字转换第7段:

每个函数返回一个字符串对象,其中包含
它的参数将通过使用格式说明符调用sprintf(buf、fmt、val)生成
分别为“%d”、“u”、“ld”、“lu”、“lld”、“llu”、“f”、“f”或“%Lf”,其中buf表示
足够大的内部字符缓冲区。

那么这肯定是一个bug

long long x = 0xdeadbeefc0defaceLL; // note LL in the end
对于
printf
,没有
ll
长度说明符。您所能得到的最好结果是:

printf ("%lx\n", x); // l is for long int

我已经在我的g++上测试了您的示例,即使没有
-std=c++0x
标志,它也不会编译错误:

~$ g++ -Wall test.cpp
~$ g++ --version
g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3

因此,是的,这在新版本中得到了修复。

对于第一个警告,我可以说您必须使用
0xdeadbeefc0defaceLL
而不是
0xdeadbeefc0deface
。之后,其他警告可能也会通过。

我在使用windows/mingw32编译C时收到相同的警告

warning: unknown conversion type character 'l' in format

因此,是的,可能是编译器/平台特定的bug。

这是一个特定于Mingw的问题,因为它调用本机Windows运行时来处理某些事情,包括这个。看


%I64d
适合我。在上面链接的答案中,还有一个更便携的解决方案,尽管它也不那么可读,

它是C++的标记。您可以得到的最好结果是
std::cout Yes对于long-long类型没有标准的说明符。但是
lld
llx
是最便携的。@MSalters:我现在添加了
c++0x
标记,使
long
成为标准类型(这就是为什么我将其标记为
c++
,但现在我意识到
long-long
c++
之前在
c++
中不是标准的)。谢谢,我现在添加了
LL
。但其他警告依然存在。
warning: unknown conversion type character 'l' in format