Как отключить предупреждение о длинных целочисленных постоянных от 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) появляется на обоих.


person Riot    schedule 11.11.2015    source источник
comment
Я не могу воспроизвести это предупреждение, и это также не имеет смысла, потому что почему функции C ++ 11 не должны быть доступны с -std=gnu++1z? Можете ли вы показать минимальный рабочий пример и указать точную версию компилятора и флаги, которые вы используете?   -  person 5gon12eder    schedule 11.11.2015
comment
long long nanoseconds = 10; if(nanoseconds < 1000000000000ll ) std::cout<<1000000000000ll; у меня работает в gcc5.2 с опцией -std=gnu++1z   -  person jha-G    schedule 11.11.2015
comment
Я обновил вопрос минимальным примером и командной строкой для воспроизведения. Я согласен, что в этой ситуации нет смысла предупреждать об использовании функций C ++ 11.   -  person Riot    schedule 11.11.2015
comment
Как насчет грубого обходного пути вроде ((long long)1000000) * 1000000?   -  person Nate Eldredge    schedule 11.11.2015
comment
Это ошибка gcc, вот еще один пример с аналогичным предупреждением. Похоже, что добавление -Wlong-long явно приводит к игнорированию диалекта языка.   -  person Praetorian    schedule 11.11.2015
comment
@Praetorian, это интересно - сообщалось об ошибке? Я не могу найти ни одного упоминания об этом.   -  person Riot    schedule 11.11.2015
comment
Я тоже не мог, вы должны подать его и дать ссылку в ответе.   -  person Praetorian    schedule 11.11.2015
comment
@Praetorian Получение предупреждения, которое вы явно запрашиваете, не является ошибкой.   -  person    schedule 11.11.2015
comment
@hvd Перечитав документацию, согласен с вами. Когда я прочитал его вчера вечером, я почему-то решил, что -pedantic всегда включает -Wlong-long и что предупреждение должно выдаваться, когда у вас включен ‹C ++ 11. Riot, извините за предложение отправить фиктивный отчет об ошибке.   -  person Praetorian    schedule 11.11.2015


Ответы (1)


Кажется, что предупреждение 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) ...
person Riot    schedule 11.11.2015