弃用C++中类的旧名称
Deprecate old name for class in C++
我在一个框架上工作,这个框架已经大规模重命名了它的所有类和函数,我创建了一个允许使用旧名称的转换头:
#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"
- 'operator='已弃用:改用 QDir::setPath()
- 现代CMake(3.8+)-FindCUDA已弃用,非.cu文件呢
- 隐式声明的 boost::iostreams::mapped_file_source 已被弃用
- C++绑定(已弃用)
- 如何替换此示例代码片段中已弃用的handler_type_t或 boost::asio::handler_type?
- QVTKWidget在VTK 8.1中已弃用,并将在未来的版本中删除
- 将 pybind11 绑定标记为已弃用的最佳方法
- 已弃用隐式声明的复制构造函数
- 将错误作为从字符串常量到"char*"的已弃用转换 [-Wwrite-strings]
- C++ VS 错误:<实验/文件系统>提供 std::experimental::文件系统的标头已被Microsoft弃用,将被删除
- 当警告为错误时使用 [[已弃用]] 属性 (-Werror)
- Eigen LinSpaced - 已弃用的副本警告
- openssl 中已弃用的 AES_ige_encrypt() API 的替代方法
- Windows SAPI 错误:"GetVersionExA":已声明已弃用
- 给定概念,SFINAE 帮助程序是否仍在规范中作为未弃用?
- Clang-CL 警告 strnicmp 已弃用,请使用 ISO C 并C++符合标准的名称_strnicmp
- 为什么在 C++20 中弃用易失性?
- 冲突的 CLANG"虚拟 dtor"和"已弃用的复制运算符"警告
- 为什么 'std::reference_wrapper' 在 c++17 中被弃用,而在 c++20 中被删除?
- 无法编译代码,因为它已在 C++11 中弃用