Можно ли предотвратить выдачу предупреждений вложенными устаревшими вызовами методов?

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

Есть ли способ подавить предупреждение об устаревании для вызова с OldMethod на OldMethodHelper? ..или лучший способ сделать это вообще?

Например (в MyClass.h):

public ref class MyClass
{
public:
    [Obsolete]
    void OldMethodHelper();

    [Obsolete]
    void OldMethod();

    void NewMethod();
};

In MyClass.cpp:

void MyClass::OldMethodHelper()
{
    // Some old helper method that's called both from within this class and externally.
}

void MyClass::OldMethod()
{
    OldMethodHelper(); // I don't want this call to raise a deprecation warning.
}

void MyClass::NewMethod()
{
    // A new method which replaces the calls to both of the previous methods.
}

Код называется так:

int main(array<System::String ^> ^args)
{
    Console::WriteLine(L"Hello World");

    MyClass m;
    m.OldMethodHelper(); // This should raise a deprecation warning.
    m.OldMethod(); // This should raise a deprecation warning.
    m.NewMethod();

    return 0;
}

Изменить. Я нашел еще один пост на SO, который предполагает использование #pragma warning(disable: 4996), возможен, но мне кажется, что это немного неуклюжий способ решить проблему:

    void MyClass::OldMethod()
    {
#pragma warning(push)
#pragma warning(disable: 4996) //4996 for _CRT_SECURE_NO_WARNINGS equivalent
        OldMethodHelper(); // I don't want this call to raise a deprecation warning.
#pragma warning(pop)
    }

Edit2 — внесены некоторые исправления/уточнения в пример кода.


person Jon Cage    schedule 27.07.2015    source источник
comment
Не могли бы вы отключить предупреждение для всего файла MyClass.cpp? Просто добавить #pragma warning(disable: 4996) сразу после #includes? Не нужно даже нажимать/выталкивать его.   -  person Dialecticus    schedule 27.07.2015
comment
Да, но я с осторожностью отношусь к этому на случай, если я раздавлю другие предупреждения, которые меня действительно могут волновать.   -  person Jon Cage    schedule 27.07.2015
comment
Трудно понять это, код C++/CLI должен использовать атрибут [Obsolete] для генерации предупреждений об устаревании. Но ведь эти старые методы хотя бы вызывают себя в отдельной единице перевода? Затем просто используйте препроцессор, оберните declspecs с помощью #ifndef SOMEMACRO... #endif. И определите SOMEMACRO с помощью настроек проекта или файла.   -  person Hans Passant    schedule 27.07.2015
comment
Это был немного надуманный пример, который я собрал (плохо) из нашей кодовой базы. Вы правы, это должен был быть реф-класс. Они действительно вызываются из отдельной единицы перевода, и ответ @Dialecticus аккуратно решает проблему. Я внес некоторые правки, чтобы исправить недостатки.   -  person Jon Cage    schedule 28.07.2015


Ответы (1)


Говорить без доказательств, но, может быть, здесь поможет макрос. Легче показать, чем объяснить:

MyClass.h
---------

#ifndef MYCLASS_DEPRECATE
#define MYCLASS_DEPRECATE [Obsolete]
#endif

class MyClass
{
    MYCLASS_DEPRECATE void OldMethodHelper();

    ...
}

MyClass.cpp
-----------

#define MYCLASS_DEPRECATE
#include "MyClass.h"

// The rest of the code
person Dialecticus    schedule 27.07.2015
comment
Я думаю, что это будет иметь противоположный эффект, т. Е. Я увижу предупреждения об устаревании только тогда, когда библиотека скомпилирована..? - person Jon Cage; 27.07.2015
comment
Пустой макрос определен в MyClass.cpp непосредственно перед #include. Это предотвращает макрос от #defined до __declspec(deprecated) в MyClass.h. Во всех остальных исходных файлах к функции присоединяется __declspec(deprecated). - person Dialecticus; 27.07.2015
comment
@JonCage (забыл упомянуть вас в предыдущем комментарии) - person Dialecticus; 27.07.2015
comment
Окей, это имеет смысл. Это кажется более аккуратным, чем обертывание большого количества кода в прагмы :-) - person Jon Cage; 27.07.2015