2015-01-27 6 views
8

У меня такая же проблема, как и у this guy. Компиляция с лязгом и я получаю кэш компилятора это предупреждение каждый раз, когда встречается Q_OBJECT:Избегайте излишних предупреждений при компиляции кода Qt с ccache/clang

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

Это происходит только при использовании CCache, компиляции тот же код с лязгом в одиночку работает отлично.

Там, кажется, similar issue with macro expansions где предлагаемое решение установить переменную окружения

CCACHE_CPP2=yes 

К сожалению, это не похоже, чтобы исправить мою проблему, или, может быть, я делаю это неправильно.

Я пробовал:

  • Здание из командной строки с

    • CCACHE_CPP2=yes ninja

    • export CCACHE_CPP2=yes ninja

  • здание из Qt Creator, добавляя CCACHE_CPP2 в «Build Environment»

Есть ли что-нибудь еще я могу сделать, чтобы исправить этот макрос вопрос о расширении? Я специально не хочу отключать предупреждения глобально (потому что это плохо) или локально (потому что это означает, что все макросы должны быть включены в шаблонный код для компилятора).

+0

Где и как вы устанавливаете 'CCACHE_CPP2'? –

+0

добавил абзац, чтобы ответить на ваш вопрос – ValarDohaeris

ответ

3

Попробуйте добавить -Wno-self-assign для флагов CPP. Это позволит вам отключить самостоятельно правопреемником ошибки:

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

или

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

Но я все равно хотел бы, чтобы это предупреждение было включено для других частей моего кода ... – ValarDohaeris

+0

Я не знаю, как легко и быстро подойти к этому вопросу. Вы можете изменить свой make-файл, чтобы скомпилировать некоторые единицы с этим флагом и некоторыми единицами без, но это будет выделение работы, и у вас все еще будет такая же проблема на устройствах с кодом Qt и другим кодом. – MichaelCMS

1

IMO игнорирование этого предупреждения в глобальном масштабе не является проблемой. Он предупреждает о фиктивном коде, а не о возможных ошибках логики, вызванных опечатками. Вот почему я проголосовал за ответ @MichaelCMS.

Но есть способ disable warning only is some section of code:

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

Это должно сделать трюк (если я не испортит имя флага), но я не люблю его, макрокоманд много котельных плит ,

+0

Извините, я не доволен любым предупреждением об отключении, потому что a) это не устраняет основную проблему, например. что, если позже я узнаю, что расширение макроса содержит другое предупреждение, и б) я пытаюсь написать переносимый код, поэтому добавление такого рода прагм быстро становится беспорядочным, например. Я уверен, что мне нужно будет обернуть прагму clang в ifdef для msvc, чтобы игнорировать его и т. Д. – ValarDohaeris

+0

есть переключатель '-Weverything ', который можно использовать для отключения всех предупреждений. –

3

Простите меня за то, что я не испытал этого, но я чувствовал, что мне все равно нужно помочь. Расширяясь в ответ Марека, есть возможность разместить прагму внутри другого макрорасширения. Это очень уродливое решение, но вам нужно только определить макрос один раз, вместо того, чтобы создавать прагмы по всей вашей кодовой базе.

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

Как вы можете видеть, я проверил его с GCC (я не имею никаких средств тестирования с лязгом прямо сейчас), но это должно работать нормально в звоне пути замены «GCC» с «грохотом» внутри макроса (и использование -Wself_assign).Применяя к вашей проблеме (псевдокод):

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

Другим недостатком является то некрасиво, что, по крайней мере, на GCC, я должен был запустить препроцессор дважды для того, чтобы работать. Не могу сказать, нужно ли то же самое для clang.

+0

Как adendum, обратите внимание, что, возможно, вообще невозможно исправить это, не подавив предупреждение. Это не простая проблема с конфигурацией и, возможно, ошибка. Если я ошибаюсь, самое лучшее, что вы можете сделать, это подать отчет об ошибке и подавить предупреждение, как это было предложено Майклом и Мареком. –