Есть ли кроссплатформенный способ отключить устаревшие предупреждения в C ++? - PullRequest
0 голосов
/ 08 мая 2018

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

itkLegacyMacro:

// Setup compile-time warnings for uses of deprecated methods if
// possible on this compiler.
#if defined( __GNUC__ ) && !defined( __INTEL_COMPILER ) && ( __GNUC__ > 3 || ( __GNUC__ == 3 && __GNUC_MINOR__ >= 1 ) )
#define itkLegacyMacro(method) method __attribute__( ( deprecated ) )
#elif defined( _MSC_VER )
#define itkLegacyMacro(method) __declspec(deprecated) method
#else
#define itkLegacyMacro(method) method
#endif

Определение метода в самой библиотеке:

class X {
itkLegacyMacro(void oldMethod());
void newMethod(); }

Вызов метода из модульного теста:

X testX;
testX.newMethod(); //test the new stuff
testX.oldMethod(); //test the old stuff too!

Последняя строка вызывает предупреждение при компиляции. Я хотел бы, чтобы эта библиотека проверяла устаревшую функциональность, но не имела предупреждений при компиляции Это возможно? C ++ 11 используется.

1 Ответ

0 голосов
/ 08 мая 2018

Насколько я знаю, __declspec(...) является расширением Microsoft и в любом случае не является кроссплатформенным.

Вы можете использовать макросы для управления этим

#ifdef _MSC_VER
#define DEPRECATED __declspec(deprecated)
#else 
#define DEPRECATED
#endif

DEPRECATED void someDeprecatedFunction()

Существует также [[deprecated("because")]] начиная с C ++ 14.

Чтобы отключить его только для модульных тестов, вы можете сделать что-то вроде

#ifndef SUPPRESS_DEPRECATE_FUNCTIONS
#define DEPRECATED __declspec(deprecated)
#else
#define DEPRECATED
#endif

, а затем #define SUPPRESS_DEPRECATE_FUNCTIONS в своем модульном тесте или скомпилировать с помощью -DSUPPRESS_DEPRECATE_FUNCTIONS.Или вы можете создать специальный заголовок в своих модульных тестах, который #pragma подавляет предупреждение.Что-то вроде

#if defined( __GNUC__ ) && !defined( __INTEL_COMPILER ) && ( __GNUC__ > 3 || ( __GNUC__ == 3 && __GNUC_MINOR__ >= 1 ) )
#pragma for gcc
#elif defined( _MSC_VER )
#pragma for msvc
#else
// nothing
#endif

#include "your_library_header.h"

В модульных тестах этот заголовок включается только перед любыми другими заголовками вашей библиотеки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...