开发者

%llx format specifier: invalid warning?

开发者 https://www.devze.com 2023-02-21 22:16 出处:网络
Edited to remove the first warning The following code works as expected in g++ 4.4.0 under mingw32: #include <cstdio>

Edited to remove the first warning

The following code works as expected in g++ 4.4.0 under mingw32:

#include <cstdio>
int main()
  {
  long long x = 0xdeadbeefc0defaceLL ;
  printf ("%llx\n", x) ;
  }

But if I enable all warnings with -Wall, it says:

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

It's the same with %lld. Is this fixed in newer versions?

Edited again to add:

The warning doesn't go away if I specify -std=c++0x, even though (i) long long is a standard type, and (ii) %lld and %llx seem to be officially supported. For instance, from 21.5 Numeric conversions para 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.

So this is a bug, surely?


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

And there is no ll length specifier for printf. The best you can get is:

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

I've tested your sample on my g++, it compiles without errors even without -std=c++0x flag:

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

So, yes, this fixed in newer versions.


For first warning I can say that you must use 0xdeadbeefc0defaceLL instead of 0xdeadbeefc0deface. After that other warnings may pass also.


I get the same warning compiling C using windows/mingw32.

warning: unknown conversion type character 'l' in format

So yes, probably a compiler/platform specific bug.


It's a Mingw-specific issue, because it calls the native Windows runtime for certain things, including this. See this answer.

%I64d works for me. In the answer linked above there is a more portable albeit less readable solution as well.

0

精彩评论

暂无评论...
验证码 换一张
取 消