Спецификатор формата% llx: недопустимое предупреждение? - PullRequest
4 голосов
/ 05 апреля 2011

Отредактировано для удаления первого предупреждения

Следующий код работает, как и ожидалось, в g ++ 4.4.0 под mingw32:

#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 ]

3 голосов
/ 05 апреля 2011
long long x = 0xdeadbeefc0defaceLL; // note LL in the end

И для printf нет спецификатора длины ll.Лучшее, что вы можете получить:

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

Я протестировал ваш пример на моем g ++, он компилируется без ошибок даже без -std=c++0x flag:

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

Итакда, это исправлено в более новых версиях.

1 голос
/ 21 марта 2015

Это проблема, специфичная для Mingw, потому что она вызывает встроенную среду выполнения Windows для определенных вещей, включая эту. См. этот ответ .

%I64d у меня работает. В ответе, приведенном выше, есть и более портативное, хотя и менее читаемое решение.

1 голос
/ 05 августа 2011

Я получаю то же предупреждение, компилируя C, используя windows / mingw32.

warning: unknown conversion type character 'l' in format

Так что да, возможно, ошибка, специфичная для компилятора / платформы.

1 голос
/ 05 апреля 2011

Для первого предупреждения я могу сказать, что вы должны использовать 0xdeadbeefc0defaceLL вместо 0xdeadbeefc0deface. После этого могут пройти и другие предупреждения.

...