Отключение спецификатора класса хранения "регистр" устарело "предупреждение"

С недавним обновлением Xcode 5.1 мы получаем кучу новых предупреждений в нашей базе кода -
это, по-видимому, связано с обновленной версией clang, которая теперь предупреждает об использовании спецификатора класса register класса хранения в источниках С++ 11 как он устарел с С++ 11:

/Users/me/Documents/Sources/boost/boost/log/attributes/attribute_set.hpp:288:9: 'register' storage class specifier is deprecated

Теперь мы хотели бы подавить предупреждение для кода, который мы не можем изменить, - как источники BOOST в приведенном выше примере.

Я могу найти флаг компилятора, чтобы включить предупреждение (-Wdeprecated-register), но есть ли что-то противоположное, чтобы отключить предупреждение из настроек Xcode..?

Ответы

Ответ 1

В общем случае добавление опции no- к опции отключает ее. Поэтому, если -Wdeprecated-register разрешает предупреждение, то -Wno-deprecated-register должен отключить его.

В качестве альтернативы, во многих компиляторах вы можете использовать прагмы (или аналогичные) в своем коде, чтобы отключать предупреждения, включая отдельные заголовки, оставляя их включенными для вашего собственного кода. Они специфичны для компилятора; для Clang, это что-то вроде

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-register"
#include "dodgy.hpp"
#pragma clang diagnostic pop

(Для GCC прагмы одинаковы, заменяя clang на GCC. Я не знаю ни о каких других компиляторах.)

Ответ 2

Подавление предупреждения является неправильным инструментом здесь. Используйте флаг -isystem, когда включаете код, который не принадлежит вам, и он не будет генерировать никаких предупреждений в этом коде.

Ответ 3

Это также работает

#if __cplusplus > 199711L
#define register      // Deprecated in C++11.
#endif  // #if __cplusplus > 199711L