我在一个大规模重命名所有类和函数的框架上工作,我创建了一个允许使用旧名称的转换头:
#define OldClassA NewClassA
#define OldClassB NewClassB
...
现在我希望编译器在使用旧名称时警告用户。我怎么能这样做?
int main(){
NewClassA newA;
OldClassA oldA; // <-- This one would emit a warning
}
答案 0 :(得分:25)
正如其他人所说,这是特定于编译器的。假设您的类使用新名称定义。以下是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;
发出警告。
答案 1 :(得分:8)
这可能是高度特定于编译器的。
对于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
declaraton / pragma:http://msdn.microsoft.com/en-us/library/044swk7y(v=vs.80).aspx
答案 2 :(得分:7)
自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开始支持。
有关如何弃用除typedef之外的其他内容的更多详细信息,请参阅http://josephmansfield.uk/articles/marking-deprecated-c++14.html。
答案 3 :(得分:1)
许多编译器支持#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"