弃用C++中类的旧名称

Deprecate old name for class in C++

本文关键字:C++ 弃用      更新时间:2023-10-16

我在一个框架上工作,这个框架已经大规模重命名了它的所有类和函数,我创建了一个允许使用旧名称的转换头:

#define OldClassA NewClassA
#define OldClassB NewClassB
...

现在,我希望编译器在使用旧名称时警告用户。我该怎么做?

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

正如其他人所说,这是非常特定于编译器的。假设您的类是用新名称定义的。以下是你可以用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;发出任何警告。

这可能是高度特定于编译器的。

对于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 C++,您可以尝试其deprecated声明符/pragma:http://msdn.microsoft.com/en-us/library/044swk7y(v=vs.80).aspx

自从C++14发布以来,您现在可以独立于编译器使用[[deprecated]]属性(只要编译器当然完全支持C++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。我不知道微软风投;clang从3.4版本起就支持这个功能。

请参阅http://josephmansfield.uk/articles/marking-deprecated-c++14.html获取有关如何弃用typedefs以外的内容的更多详细信息。

许多编译器都支持#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"。或者在C++11中,您可以使用static_assert

类似这样的东西:

#ifdef OldClassA
   #warning "old class name is used"