__pragma(不建议使用)和__declspec之间的区别(不建议使用)

时间:2014-10-17 16:16:27

标签: c windows pragma

要在Visual Studio下将对象声明为C / C ++中的弃用,您有三个解决方案:

  • #pragma deprecated(X)
  • __pragma(deprecated(X))
  • __declspec(deprecated(X))

前两个是相同的,只是在宏内部只能使用第二个;我把第一个只是为了完整性。第三个似乎是开发社区中使用最多的。

我想知道最后两个有什么区别。根据MSDN herehere上的文档,我知道没有区别。在这种情况下,奇怪的是根据您使用的内容引发不同的警告代码:C4995用于pragma-case,C4996用于declspec-case。

那么有人知道是否存在差异(任何微小的差异),或者为什么这些指令不会引发相同的警告代码?

3 个答案:

答案 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]]不能。