要在Visual Studio下将对象声明为C / C ++中的弃用,您有三个解决方案:
#pragma deprecated(X)
__pragma(deprecated(X))
__declspec(deprecated(X))
前两个是相同的,只是在宏内部只能使用第二个;我把第一个只是为了完整性。第三个似乎是开发社区中使用最多的。
我想知道最后两个有什么区别。根据MSDN here和here上的文档,我知道没有区别。在这种情况下,奇怪的是根据您使用的内容引发不同的警告代码:C4995用于pragma-case,C4996用于declspec-case。
那么有人知道是否存在差异(任何微小的差异),或者为什么这些指令不会引发相同的警告代码?
答案 0 :(得分:8)
请参阅deprecated (C++):
(特定于Microsoft)除了下面提到的例外情况,已弃用的声明提供的功能与弃用的pragma相同:
- 不推荐使用的声明允许您将特定形式的函数重载指定为已弃用,而pragma表单适用于函数名称的所有重载形式。
- 已弃用声明允许您指定将在编译时显示的消息。消息的文本可以来自宏。
- 宏只能使用已弃用的pragma标记为已弃用。
对于#pragma
与__pragma
,请参阅Pragma Directives and the __Pragma Keyword:
__pragma()关键字
Microsoft特定
编译器还支持 __ pragma 关键字,该关键字与 #pragma 指令具有相同的功能,但可以在宏定义中内联使用。
值得注意的是, @Deduplicator 提到, C ++ 14 引入了[[deprecated]]
属性。
7.6.5不推荐使用的属性[dcl.attr.deprecated]
attribute-token
deprecated
可用于标记仍然允许使用的名称和实体,但是 因某种原因气馁。 [注意:特别是deprecated
适用于名称和实体 被视为过时或不安全。 - 结束记录]
答案 1 :(得分:3)
我刚发现的另一件事。
我在头文件中定义了这个类:
class X
{
void F1();
void F2();
}
现在,我想弃用F1,但是当你使用pragma deprecated
时,每次包含头文件时都会收到警告,即使从未使用过F1。
class X
{
#pragma deprecated(F1)
void F1();
void F2();
}
现在将其更改为使用__declspec(deprecated())
,您只会在使用F1的时间和地点获取已弃用的消息。在我看来,除非你希望人们使用#pragma deprecated
,否则你永远不应该使用#pragma warning (disable: 4995)
,因为警告你无法摆脱它是非常讨厌的。
class X
{
__declspec(deprecated("Please use F2")) void F1();
void F2();
}
答案 2 :(得分:0)
请注意,__declspec(deprecated)
不能用于using
声明,而[[deprecated]]
不能。