Правильный способ указания 64-битных целых чисел, который подходит как для GCC, так и для clang. ⇐ C++
-
Гость
Правильный способ указания 64-битных целых чисел, который подходит как для GCC, так и для clang.
Я компилирую код, использующий форматирование в стиле printf в C++ (2017). Базовый код, который работает без каких-либо предупреждений с помощью clang:
av_log(is, AV_LOG_VERBOSE, "Корректировка времени начала по %lld\n", new_start_time - is->start_time); ...но если я скомпилирую его с помощью GCC, я получу следующее предупреждение:
/Users/gabry/projects/wycoder/ffclass/ffclass.cpp:189:110: предупреждение: формат «%lld» ожидает аргумент типа «long long int», но аргумент 4 имеет тип «int64_t { он же long int}' [-Wformat=] av_log(is, AV_LOG_VERBOSE, "Исправление времени начала на %lld\n", new_start_time - is->start_time); ... Я нашел ответ на вопрос о переполнении стека, который предлагает изменить код на:
av_log(is, AV_LOG_VERBOSE, "Коррекция времени начала с помощью " PRId64 "\n", new_start_time - is->start_time); ... но если я изменю код таким образом, я получу еще одно предупреждение от GCC...
/Users/gabry/projects/wycoder/ffclass/ffclass.cpp:189:116: предупреждение: слишком много аргументов для формата [-Wformat-extra-args] av_log(is, AV_LOG_VERBOSE, "Исправление времени запуска с помощью " PRId64 "\n", new_start_time - is->start_time); Код работает корректно (в обоих направлениях), и я не хочу отключать -Wformat, поскольку он часто бывает полезен, но полезные предупреждения тонут в такого рода сообщениях... Есть идеи?
Я компилирую код, использующий форматирование в стиле printf в C++ (2017). Базовый код, который работает без каких-либо предупреждений с помощью clang:
av_log(is, AV_LOG_VERBOSE, "Корректировка времени начала по %lld\n", new_start_time - is->start_time); ...но если я скомпилирую его с помощью GCC, я получу следующее предупреждение:
/Users/gabry/projects/wycoder/ffclass/ffclass.cpp:189:110: предупреждение: формат «%lld» ожидает аргумент типа «long long int», но аргумент 4 имеет тип «int64_t { он же long int}' [-Wformat=] av_log(is, AV_LOG_VERBOSE, "Исправление времени начала на %lld\n", new_start_time - is->start_time); ... Я нашел ответ на вопрос о переполнении стека, который предлагает изменить код на:
av_log(is, AV_LOG_VERBOSE, "Коррекция времени начала с помощью " PRId64 "\n", new_start_time - is->start_time); ... но если я изменю код таким образом, я получу еще одно предупреждение от GCC...
/Users/gabry/projects/wycoder/ffclass/ffclass.cpp:189:116: предупреждение: слишком много аргументов для формата [-Wformat-extra-args] av_log(is, AV_LOG_VERBOSE, "Исправление времени запуска с помощью " PRId64 "\n", new_start_time - is->start_time); Код работает корректно (в обоих направлениях), и я не хочу отключать -Wformat, поскольку он часто бывает полезен, но полезные предупреждения тонут в такого рода сообщениях... Есть идеи?
Мобильная версия