已编辑以删除第一个警告
以下代码在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.
所以这肯定是个错误吗?
答案 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
适合我。在上面链接的答案中,有一个更便携,虽然不太可读的解决方案。