2015-11-11 17 views
5

Ho qualche codice con grandi letterali interi come segue:Come lungo silenzio lungo avvertimento costante intero da GCC

if(nanoseconds < 1'000'000'000'000) 

Questo dà l'avviso del compilatore integer constant is too large for 'long' type [-Wlong-long]. Tuttavia, se cambio a:

if(nanoseconds < 1'000'000'000'000ll) 

... io invece ottengo l'avvertimento use of C++11 long long integer constant [-Wlong-long].

Vorrei disattivare questo avviso solo per questa riga, ma senza disabilitare -Lungo-lungo o utilizzando -Wno-long-long per l'intero progetto. Ho provato a circondarlo con:

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

ma questo non sembra funzionare qui con questo avviso. C'è qualcos'altro che posso provare?

Sto costruendo con -std=gnu++1z.

Edit: esempio minimo per i commenti:

#include <iostream> 
auto main()->int { 
    double nanoseconds = 10.0; 
    if(nanoseconds < 1'000'000'000'000ll) { 
    std::cout << "hello" << std::endl; 
    } 
    return EXIT_SUCCESS; 
} 

Edificio con g++ -std=gnu++1z -Wlong-long test.cpptest.cpp:6:20: warning: use of C++11 long long integer constant [-Wlong-long]

devo dire questo è su una piattaforma a 32 bit, Windows con MinGW-W64 (gcc 5.1.0) - il primo avvertimento non sembra apparire sui miei sistemi Linux a 64 bit, ma il secondo (con il suffisso ll) appare su entrambi.

+1

non riesco a riprodurre questo avviso e anche non ha senso perché perché le caratteristiche del C++ 11 non dovrebbero essere disponibili con '-std = gnu ++ 1z'? Puoi mostrare un esempio di lavoro minimo e dare la tua esatta versione del compilatore e le bandiere che usi? – 5gon12eder

+0

'lunghi nanosecondi = 10; if (nanosecondi <1000000000000ll) std :: cout << 1000000000000ll; 'funziona per me in' gcc5.2' con opzione '-std = gnu ++ 1z' ​​ – gjha

+0

Ho aggiornato la domanda con un esempio minimo e una riga di comando da riprodurre . Sono d'accordo che non ha senso essere avvertimento sull'utilizzo di funzionalità C++ 11 in questa situazione. – Riot

risposta

3

Sembra che l'avviso C++ 11 quando si utilizza il suffisso ll possa essere a gcc bug. (Grazie @praetorian)

Una soluzione (ispirato dal commento di @ nate-Eldredge) è quello di evitare l'uso letterale e lo hanno prodotto al momento della compilazione con constexpr:

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