我在一个已大量重命名其所有类和函数的框架上工作,我创建了一个允许使用旧名称的转换头:
#define OldClassA NewClassA
#define OldClassB NewClassB
...
现在我希望编译器在使用旧名称时警告用户。我怎样才能做到这一点?
int main(){
NewClassA newA;
OldClassA oldA; // <-- This one would emit a warning
}
我在一个已大量重命名其所有类和函数的框架上工作,我创建了一个允许使用旧名称的转换头:
#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”:已宣布弃用
海合会产生:
警告:不推荐使用“OldClassA”
NewClassA newA;
任何一个编译器都不会发出警告。
这可能是高度特定于编译器的。
对于 GCC,http://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Type-Attributes.html 的参考页面描述了该deprecated
属性并提供了typedef
s 的示例,我认为这些示例应该适合您的需求:
typedef NewClassA OldClassA __attribute__ ((deprecated));
Clang 有类似的东西,见http://clang.llvm.org/docs/LanguageExtensions.html
对于 Visual C++,您可以尝试它的deprecated
声明/编译指示: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
. 我不了解 MSVC;clang 从 3.4 版开始支持此功能。
请参阅http://josephmansfield.uk/articles/marking-deprecated-c++14.html了解有关如何弃用除 typedef 之外的其他内容的更多详细信息。
许多编译器支持#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"