什么是__declspec,我什么时候需要使用它?

Sco*_*t J 142 c++

__declspec在代码中看到了我正在阅读的实例.它是什么?我什么时候需要使用这个结构?

Jar*_*Par 69

这是Microsoft特定的C++语言扩展,允许您使用存储类信息来定义类型或函数.

文档

__declspec(C++)

  • 谢谢 - 但我会用它做什么? (19认同)
  • 例如,为了声明COM接口和类,您使用__declspec(uuid)来导出函数,而不是使用__declspec(dllexport)等的DEF文件.完整列表很长. (4认同)
  • @ScottJ 我经常将它用于属性:__declspec(property(get=X put=X)) 数据类型标识符。MSDN当然有更多细节。作为“C# 到 C/C++ 程序员”,这是一种幸福! (2认同)

Ale*_*ler 49

规范示例是__declspec(dllimport)__declspec(dllexport),它指示链接器(分别)从DLL导入和导出符号.

// header
__declspec(dllimport) void foo();


// code - this calls foo() somewhere in a DLL
foo();
Run Code Online (Sandbox Code Playgroud)

(__declspec(..)只是包装了Microsoft的特定内容 - 为了实现兼容性,人们通常会用宏来包装它)

  • 你怎么知道dllimport指的是什么? (10认同)
  • @tetris,你不知道代码.决策由链接器决定,链接器将选择它找到的第一个具有匹配导出符号的`.lib`. (8认同)

And*_*Dog 18

它主要用于将符号从/导出符号导入共享库(DLL).Visual C++和GCC编译器都支持__declspec(dllimport)__declspec(dllexport).MSDN中记录其他用途(仅限某些Microsoft).


Hac*_*one 12

另一个例子来说明__declspec关键字:

在编写Windows内核驱动程序时,有时您希望使用内联汇编程序代码编写自己的prolog/epilog代码序列,因此可以使用naked属性声明函数.

__declspec( naked ) int func( formal_parameters ) {}
Run Code Online (Sandbox Code Playgroud)

要么

#define Naked __declspec( naked )
Naked int func( formal_parameters ) {}
Run Code Online (Sandbox Code Playgroud)

请参考naked(C++)


Sev*_*yev 6

从本质上讲,它是Microsoft引入其C++扩展的方式,因此它们不会与标准C++的未来扩展冲突.使用__declspec,您可以归属函数或类; 具体含义取决于__declspec的性质.例如,__ declspec(裸)抑制prolog/epilog生成(对于中断处理程序,可嵌入代码等),__ declspec(thread)使变量成为本地线程,依此类推.

完整的__declspec属性列表在MSDN上可用,并且因编译器版本和平台而异.

  • 考虑到像 `GCC 4.2` 这样的非微软编译器,除了提供 `__attribute__ ((dllexport))` 到 `__declspec(dllexport)` 的替代方案,调用 `__declspec`,一个微软专用的扩展是否公平? (3认同)