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
макрос расширяется до вашей целевой системы).