Как заставить замолчать длинное длинное целочисленное постоянное предупреждение от GCC

У меня есть код с использованием целочисленных литералов следующим образом:

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 суффикс) появляется на обоих.

5

Решение

Похоже, что предупреждение 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) ...
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]