Устаревшее имя для класса в С++
Я работаю над каркасом, который массово переименовал все его классы и функции, я создал заголовок перехода, позволяющий использовать старые имена:
#define OldClassA NewClassA
#define OldClassB NewClassB
...
Теперь я хотел бы, чтобы компилятор предупреждал пользователя, когда используется старое имя. Как я могу это сделать?
int main(){
NewClassA newA;
OldClassA oldA; // <-- This one would emit a warning
}
Ответы
Ответ 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.
Ответ 4
Многие компиляторы поддерживают директиву #warning
. Например. VS: http://msdn.microsoft.com/en-us/library/aa266053(v=vs.60).aspx или GCC:
http://gcc.gnu.org/onlinedocs/cpp/Diagnostics.html
#warning "old class name is used"
. Или в С++ 11 вы можете использовать static_assert
.
Что-то вроде этого:
#ifdef OldClassA
#warning "old class name is used"