C++98 педантичные ошибки при использовании целых чисел фиксированной ширины

Моя компания медленно переходит с 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 ответ

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

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

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

Другие вопросы по тегам