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

Ben*_*y13 7 c windows pragma

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

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

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

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

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

Ale*_*exD 8

请参阅deprecated(C++):

(特定于Microsoft)除了下面提到的例外情况,已弃用的声明提供与已弃用的pragma相同的功能:

  • 弃用声明让你指定为推荐的函数重载的特殊形式,而形式附注适用于函数名称的所有重载形式.
  • 弃用声明让你指定一个消息将显示在编译的时候.消息的文本可以来自宏.
  • 只能使用已弃用的pragma 将宏标记为弃用.

对于#pragmavs. __pragma,请参阅Pragma指令和__Pragma关键字:

__pragma()关键字

微软具体

编译器还支持__pragma关键字,该关键字具有与#pragma指令相同的功能,但可以在宏定义中内联使用.


值得注意的是,正如@Deduplicator所提到的,C++ 14引入了该[[deprecated]]属性.

7.6.5不推荐使用的属性[dcl.attr.deprecated]

属性令牌 deprecated可以用来标记的名称和它的使用仍然是允许的实体,但不鼓励出于某种原因.[ 注意:特别deprecated适用于被视为过时或不安全的名称和实体.- 结束说明 ]