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

时间:2011-04-05 07:38:37

标签: c++ c++11 g++

已编辑以删除第一个警告

以下代码在gingw32:

下的g ++ 4.4.0中按预期工作
#include <cstdio>
int main()
  {
  long long x = 0xdeadbeefc0defaceLL ;
  printf ("%llx\n", x) ;
  }

但如果我使用-Wall启用所有警告,则会显示:

f.cpp: In function 'int main()':
f.cpp:5: warning: unknown conversion type character 'l' in format
f.cpp:5: warning: too many arguments for format

%lld相同。这是在较新版本中修复的吗?

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

Each function returns a string object holding the character representation of the value of its argument that would be generated by calling sprintf(buf, fmt, val) with a format specifier of "%d", "%u", "%ld", "%lu", "%lld", "%llu", "%f", "%f", or "%Lf", respectively, where buf designates an internal character buffer of sufficient size.

所以这肯定是个错误吗?

4 个答案:

答案 0 :(得分:3)

long long x = 0xdeadbeefc0defaceLL; // note LL in the end

ll没有printf长度说明符。你能得到的最好的是:

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

所以,是的,这在新版本中得到了修复。

答案 1 :(得分:1)

首次警告我可以说您必须使用0xdeadbeefc0defaceLL代替0xdeadbeefc0deface。之后,其他警告也可能通过。

答案 2 :(得分:1)

我得到了使用windows / mingw32编译C的相同警告。

warning: unknown conversion type character 'l' in format

所以是的,可能是编译器/平台特有的错误。

答案 3 :(得分:1)

这是一个特定于Mingw的问题,因为它为某些事情调用本机Windows运行时,包括这个。请参阅this answer

%I64d适合我。在上面链接的答案中,有一个更便携,虽然不太可读的解决方案。