У меня есть код с использованием целочисленных литералов следующим образом:
if(nanoseconds < 1'000'000'000'000)
Это дает предупреждение компилятору integer constant is too large for 'long' type [-Wlong-long]
, Однако, если я изменю это на:
if(nanoseconds < 1'000'000'000'000ll)
…Вместо этого я получаю предупреждение use of C++11 long long integer constant [-Wlong-long]
,
Я хотел бы отключить это предупреждение только для этой строки, но без отключения -Wlong-long или использования -Wno-long-long для всего проекта. Я попытался окружить это:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wlong-long"...
#pragma GCC diagnostic pop
но это, похоже, не работает здесь с этим предупреждением. Есть что-то еще, что я могу попробовать?
Я строю с -std=gnu++1z
,
Изменить: минимальный пример для комментариев:
#include <iostream>
auto main()->int {
double nanoseconds = 10.0;
if(nanoseconds < 1'000'000'000'000ll) {
std::cout << "hello" << std::endl;
}
return EXIT_SUCCESS;
}
Здание с g++ -std=gnu++1z -Wlong-long test.cpp
дает test.cpp:6:20: warning: use of C++11 long long integer constant [-Wlong-long]
Я должен упомянуть, что это на 32-битной платформе, Windows с MinGW-w64 (gcc 5.1.0) — первое предупреждение не появляется в моих 64-битных системах Linux, но второе (с ll
суффикс) появляется на обоих.
Похоже, что предупреждение C ++ 11 при использовании ll
суффикс может быть ошибка gcc. (Спасибо @praetorian)
Обходной путь (вдохновленный комментарием @ nate-eldredge) — избегать использования литерала и производить его во время компиляции с constexpr:
int64_t constexpr const trillion = int64_t(1'000'000) * int64_t(1'000'000);
if(nanoseconds < trillion) ...
Других решений пока нет …