Подтвердить что ты не робот

Устаревшее имя для класса в С++

Я работаю над каркасом, который массово переименовал все его классы и функции, я создал заголовок перехода, позволяющий использовать старые имена:

#define OldClassA NewClassA
#define OldClassB NewClassB
...

Теперь я хотел бы, чтобы компилятор предупреждал пользователя, когда используется старое имя. Как я могу это сделать?

int main(){
  NewClassA newA;
  OldClassA oldA; // <-- This one would emit a warning
}
4b9b3361

Ответ 1

Как говорят другие, это очень специфичный компилятор. Предполагая, что ваши классы определены с новым именем. Вот что вы можете сделать с GCC и MSVC:

class NewClassA {}; // Notice the use of the new name.

// Instead of a #define, use a typedef with a deprecated atribute:

// MSVC
typedef NewClassA __declspec(deprecated) OldClassA;

// GCC
//typedef NewClassA __attribute__((deprecated)) OldClassA;

int main(){
    NewClassA newA;
    OldClassA oldA;
}

MSVC дает:

предупреждение C4996: "OldClassA": объявлено устаревшим

GCC дает:

предупреждение: "OldClassA" устарел

Никакое предупреждение не передается для NewClassA newA; компилятором.

Ответ 2

Это, скорее всего, очень специфичный для компилятора.

Для GCC эталонная страница http://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Type-Attributes.html описывает атрибут deprecated и имеет примеры для typedef, которые, как мне кажется, подходят ваши потребности:

typedef NewClassA OldClassA __attribute__ ((deprecated));

Clang имеет нечто похожее, см. http://clang.llvm.org/docs/LanguageExtensions.html

Для Visual С++ вы можете попробовать его deprecated declaraton/pragma: http://msdn.microsoft.com/en-us/library/044swk7y(v=vs.80).aspx

Ответ 3

Начиная с выпуска С++ 14, теперь вы можете использовать атрибут [[deprecated]], независимо от компилятора (до тех пор, пока компилятор полностью поддерживает С++ 14, конечно).

В вашем случае вы должны использовать:

[[deprecated]]
typedef NewClassA OldClassA;

// You can also include a message that will show up in the compiler
// warning if the old name is used:

[[deprecated("OldClassA is deprecated; use NewClassA instead.")]]
typedef NewClassA OldClassA;

Обратите внимание, что это поддерживается только в gcc-4.9 (если используется gcc), и вам нужно указать -std=c++1y. Я не знаю о MSVC; clang поддерживает это с версии 3.4.

См. http://josephmansfield.uk/articles/marking-deprecated-c++14.html для получения более подробной информации о том, как осуждать вещи, отличные от просто typedefs.