2015-11-11 16 views
5

У меня есть некоторый код, с помощью больших целочисленных литералов следующим образом:Как долго молчать длинное целое постоянное предупреждение от 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].

Я бы хотел отключить это предупреждение только для этой строки, но без отключения - долгое время или использование -Wno-long-long для всего проекта. Я попытался окружить его:

#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wlong-long" 
... 
#pragma GCC diagnostic pop 

, но это не работает здесь с этим предупреждением. Есть ли что-то еще, что я могу попробовать?

Я строю с -std=gnu++1z.

Edit: минимальный пример для комментариев:

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

+1

Я не могу воспроизвести это предупреждение, и это также не имеет смысла, потому что почему бы не использовать возможности C++ 11 с помощью '-std = gnu ++ 1z'? Можете ли вы показать минимальный рабочий пример и дать точную версию и флаги компилятора, которые вы используете? – 5gon12eder

+0

'длинные наносекунды = 10; if (nanoseconds <1000000000000ll) std :: cout << 1000000000000ll; 'работает для меня в' gcc5.2' с опцией '-std = gnu ++ 1z' ​​ – gjha

+0

Я обновил вопрос с минимального примера и командной строки для воспроизведения , Я согласен, что нет смысла предупреждать об использовании возможностей C++ 11 в этой ситуации. – Riot

ответ

3

Похоже, что предупреждение C++ 11 при использовании суффикса ll может быть a gcc bug. (Спасибо @praetorian)

Обходной (вдохновленный комментарий @ Nate-Элдридж в), чтобы избежать использования буквального и он производится во время компиляции с constexpr:

int64_t constexpr const trillion = int64_t(1'000'000) * int64_t(1'000'000); 
if(nanoseconds < trillion) ... 

 Смежные вопросы

  • Нет связанных вопросов^_^