C ++ 98 педантичные ошибки при использовании целых чисел фиксированной ширины - PullRequest
2 голосов
/ 03 мая 2019

Моя компания медленно переходит с C на C ++ 98.C ++ 98 - это расширенный набор C, так что это не должно быть проблемой, но это так.Печать 64-битных целых чисел фиксированной ширины с использованием printf не работает, когда используется в сочетании с педантичностью, флагами предупреждений и указанием кода для 32-битной среды.

Числа, которые мне нужно напечатать, имеют тип uint64_t.И я понимаю использование PRIX64 при использовании printf.Однако, как только дополнительные флаги добавляются при компиляции, появляются ошибки.

Я посмотрел на заголовки, чтобы увидеть, есть ли что-то странное, но все выглядит хорошо.Я не уверен, почему использование этой комбинации работает в C, но не в C ++.Конечно, правильный способ решить эту проблему - начать использовать std::cout, но кода для редактирования так много, что невозможно сделать все сразу.

Минимальный пример, показанный ниже (print.cpp):

#include <stdio.h>

#define __STDC_FORMAT_MACROS
#include <inttypes.h>

int main()
{
  uint64_t num = 0x0;
  printf("num is %" PRIX64"\n", num);

  return 0;
}

команда, использованная для его компиляции:

g++ print.cpp -o print  --std=c++98 -Wall -m32 --pedantic

Ожидаемый результат: ошибок нет, номер печатается.Результат:

warning: ISO C++ does not support the ‘ll’ gnu_printf length modifier

1 Ответ

1 голос
/ 03 мая 2019

C ++ 98 не имеет uint64_t или PRIX64 (ни llx).Они были введены в C ++ в C ++ 11 (примечание: они не представлены в C до стандарта C99).

Эти макросы могут работать случайно, так как они предоставляются стандартной библиотекой, котораяпо-видимому, имеет поддержку более нового стандарта и не делает все возможное, чтобы помешать старому коду использовать новые функции.Но они не гарантированно работают

Компилятор, кажется, не предупреждает о макросах, предположительно, потому что разработчики не были вынуждены инструктировать препроцессор для выполнения такой диагностики.Но компилятор достаточно дружественен для диагностики использования нестандартного спецификатора printf (спецификатор llx, в который расширяется макрос PRIX64 в целевой системе).

...