2015-01-27 12 views
8

Mam ten sam problem co this guy. Kompilacja z brzękiem i ccache otrzymuję ten spędzaj ostrzegawczy, gdy napotka Q_OBJECT:Unikaj zbędnych ostrzeżeń podczas kompilowania kodu Qt z ccache/clang

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

Dzieje się tak tylko w przypadku korzystania ccache, kompilacji tego samego kodu z brzękiem sam działa dobrze.

Wydaje się być similar issue with macro expansions gdzie proponowane rozwiązanie jest ustawienie zmiennej środowiskowej

CCACHE_CPP2=yes 

Niestety, to nie wydaje się rozwiązać mój problem, a może robię to źle.

Próbowałem:

  • budynku z linii poleceń z

    • CCACHE_CPP2=yes ninja

    • export CCACHE_CPP2=yes ninja

  • budynku z Qt Creator, dodając CCACHE_CPP2 do „Build Environment”

Czy coś jeszcze mogę zrobić, aby rozwiązać ten problem ekspansji makro? W szczególności nie chcę wyłączać ostrzeżeń na całym świecie (ponieważ jest to złe) lub lokalnie (ponieważ oznacza to zawijanie wszystkich makr w specyficznej dla kompilatora płycie głównej).

+0

Gdzie i jak ustawiasz "CCACHE_CPP2"? –

+0

dodał akapit, aby odpowiedzieć na twoje pytanie. – ValarDohaeris

Odpowiedz

3

Spróbuj dodać -Wno-przydzielić do flag CPP. Powinno to pozwolić na wyłączenie błędy samodzielnie przypisze:

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

lub

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

Ale nadal chciałbym mieć to ostrzeżenie włączone dla innych części mojego kodu ... – ValarDohaeris

+0

Nie znam łatwego i szybkiego sposobu podejścia do tego. Możesz zmienić plik makefile, aby skompilować niektóre jednostki z tą flagą i niektórymi jednostkami bez, ale będzie to dużo pracy i nadal będziesz miał ten sam problem na jednostkach z kodem Qt i innym kodem. – MichaelCMS

1

IMO ignorowanie to ostrzeżenie na całym świecie nie jest problemem. Ostrzega przed fałszywym kodem, a nie o potencjalnych błędach logicznych spowodowanych literówką. Właśnie dlatego głosowałem za odpowiedzią @MichaelCMS.

Ale istnieje sposób, aby disable warning only is some section of code:

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

To powinno załatwić sprawę (jeśli nie bałagan nazwę Flag), ale to nie podoba, do makr płytowych wiele kotłów .

+0

Przykro mi, nie jestem zadowolony z żadnego rodzaju wyłączonych ostrzeżeń, ponieważ a) nie rozwiązuje to problemu, np. co, jeśli później dowiem się, że makro-rozszerzenie zawiera inne ostrzeżenie i b) próbuję napisać przenośny kod, więc dodanie tego rodzaju pragmy szybko staje się niepotrzebne, np. Jestem prawie pewien, że będę musiał zawrzeć pragmę clang w ifdef dla msvc, aby ją zignorować itd. – ValarDohaeris

+0

jest przełącznik '-Weverything', który może być użyty do wyłączenia wszystkich ostrzeżeń. –

3

Przebaczam, że nie mam tego języka, żeby to przetestować, ale czułem, że powinienem i tak pomóc. Rozszerzając odpowiedź Marka, istnieje możliwość umieszczenia pragmy w innym rozszerzeniu makr. To bardzo brzydkie rozwiązanie, ale w ten sposób wystarczy tylko raz zdefiniować makro, zamiast rozdzielać pragmy po całej bazie kodu.

#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 
} 

Jak widać, ja testowałem to z gcc (I nie mają możliwości testowania z brzękiem teraz), ale które powinny działać prawidłowo w brzękiem przez podstawienie „GCC” z „hukiem” wewnątrz makra (i użycie opcji -Właściwość_nazwa).Stosując się do problemu (pseudokod):

#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 
} 

Kolejny brzydki minusem jest to, że przynajmniej na gcc, musiałem biec dwa razy preprocesora do jego pracy. Nie mogę powiedzieć, czy to samo jest potrzebne do klang.

+0

Jako adendum, zauważ, że prawdopodobnie nie da się tego naprawić w ogóle, nie wyłączając ostrzeżenia. To nie jest prosty problem z konfiguracją i może błąd. O ile się nie mylę, najlepiej zrobić zgłoszenie błędu i wyłączyć ostrzeżenie, jak sugerują Michael i Marek. –

Powiązane problemy