2015-01-27 7 views
8

Ho lo stesso problema di this guy. Compilare con clang e ccache ottengo questo avvertimento ogni volta incontra un Q_OBJECT:Evita gli avvertimenti superflui durante la compilazione del codice Qt con ccache/clang

warning: explicitly assigning value of variable of type 'int' to itself [-Wself-assign] 

Questo accade solo quando si utilizza ccache, compilare lo stesso codice con clangore solo funziona bene.

Sembra che ci sia un similar issue with macro expansions in cui la soluzione suggerita è quella di impostare la variabile d'ambiente

CCACHE_CPP2=yes 

Purtroppo, questo non sembra risolvere il mio problema, o forse sto facendo male.

ho provato:

  • Compilare da riga di comando con

    • CCACHE_CPP2=yes ninja

    • export CCACHE_CPP2=yes ninja

  • Compilare da Qt Creator, aggiungendo CCACHE_CPP2 per "Build Environment"

C'è qualcos'altro che posso fare per risolvere questo problema di espansione macro? In particolare, non voglio disabilitare gli avvisi a livello globale (perché ciò è negativo) o localmente (perché ciò significa avvolgere tutte le macro nel boilerplate specifico del compilatore).

+0

Dove e come si imposta 'CCACHE_CPP2'? –

+0

aggiunto un paragrafo per rispondere alla tua domanda – ValarDohaeris

risposta

3

Provare ad aggiungere -Auto-assegna ai flag CPP. Esso dovrebbe consentire di disattivare gli errori di auto-assegnazione:

CXXFLAGS= $(CXXFLAGS) -Wno-self-assign 

o

CPPFLAGS=$(CPPFLAGS) -Wno-self-assign 
+0

Ma mi piacerebbe comunque avere questo avviso abilitato per altre parti del mio codice ... – ValarDohaeris

+0

Non conosco un modo facile e veloce per avvicinarsi a questo. Puoi cambiare il tuo makefile per compilare alcune unità con questo flag e alcune unità senza, ma sarà utile e avremo lo stesso problema su unità con sia il codice Qt che l'altro codice. – MichaelCMS

1

IMO ignorare questo avvertimento a livello globale non è un problema. Avvisa sul codice fittizio, non sui potenziali errori logici causati da errori di battitura. Questo è il motivo per cui ho votato la risposta @MichaelCMS.

Ma c'è un modo per disable warning only is some section of code:

#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wself-assign" 
Q_OBJECT 
#pragma clang diagnostic pop 

Questo dovrebbe fare il trucco (se non ho fatto rovinare il nome del flag), ma non mi piace, per le macro piastra molto caldaia .

+0

Siamo spiacenti, non sono soddisfatto di alcun tipo di avviso disabilitato perché a) che non risolve il problema sottostante, ad es. cosa succede se in seguito scopro che l'espansione della macro contiene un altro avvertimento eb) Sto provando a scrivere codice portatile, quindi aggiungere questo tipo di pragma diventa rapidamente disordinato, ad es. Sono abbastanza sicuro che avrei bisogno di racchiudere il clang pragma in un ifdef per msvc per ignorarlo ecc. – ValarDohaeris

+0

c'è lo switch '-Weverything' che potrebbe essere usato per disabilitare tutti gli avvertimenti. –

3

Perdonami per non avere clang a testare questo, ma ho sentito che dovrei comunque aiutare. Espandendo la risposta di Marek, c'è la possibilità di inserire il pragma all'interno di un'altra espansione macro. È una soluzione molto brutta, ma in questo modo devi solo definire la macro una volta, invece di generare i pragmi in tutto il tuo codice base.

#define WARN int&x = x; 

#define NO_WARN _Pragma("GCC diagnostic push") \ 
_Pragma("GCC diagnostic ignored \"-Wuninitialized\"") \ 
WARN \ 
_Pragma("GCC diagnostic pop") 

int main(){ 
    NO_WARN 
} 

Come potete vedere, ho provato con gcc (non ho modo di test con clangore in questo momento), ma che dovrebbe funzionare bene in clang sostituendo "GCC" con "clang" all'interno della macro (e usando -Wself_assign).Applicando al vostro problema (pseudocodice):

#ifdef clang 
#define MY_Q_OBJECT _Pragma("clang diagnostic push") \ 
_Pragma("clang diagnostic ignored \"-Wself-assign\"") \ 
Q_OBJECT \ 
_Pragma("clang diagnostic pop") 
#else 
#define MY_Q_OBJECT Q_OBJECT 
#endif 
class A{ 
    MY_Q_OBJECT // Unfortunately you still need to replace Q_OBJECT on your classes 
} 

Un altro brutto aspetto negativo è che, almeno su gcc, ho dovuto correre il preprocessore due volte per farlo funzionare. Non posso dire se lo stesso è necessario per clang.

+0

Come avviso, si noti che probabilmente non è possibile risolvere questo problema senza sopprimere l'avviso. Non è un semplice problema di configurazione, e forse un bug. A meno che non mi sbagli, il meglio che puoi fare è presentare un bug report e sopprimere l'avviso, come suggerito da Michael e Marek. –

Problemi correlati