什么是__declspec?何时需要使用它?


157

__declspec在阅读的代码中看到了的实例。它是什么?我什么时候需要使用这种构造?


1
如果您不走运并且从Linux迁移到Windows,您可能会浪费时间试图弄清楚为什么DLL无法工作,直到发现必须__declspec(dllexport)在库中的每个函数之前添加
SomethingSomething

Answers:


74

这是Microsoft对C ++语言的特定扩展,允许您使用存储类信息为类型或函数赋予属性。

文献资料

__declspec(C ++)


19
谢谢-但是我会用它做什么呢?
Scott J 2010年

4
例如,对于声明COM接口和类,您使用__declspec(uuid),对于导出函数,如果没有DEF文件,则使用__declspec(dllexport),等等。完整列表很长。
塞瓦·阿列克谢耶夫

1
@ScottJ我经常将其用于属性:__declspec(property(get = X put = X))数据类型标识符。MSDN当然有更多详细信息。作为“从C#到C / C ++程序员”,这真是幸福!
2012年

51

规范示例是__declspec(dllimport)__declspec(dllexport),它们指示链接程序分别(从)向DLL导入符号或向DLL导出符号。

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


// code - this calls foo() somewhere in a DLL
foo();

__declspec(..)只包装了Microsoft的特定内容-为了实现兼容性,通常会用宏将其包装掉)


8
@tetris,您从代码中不知道。链接器将做出决定,链接器将选择.lib找到的第一个具有匹配的导出符号的链接器。
Euro Micelli

19

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


12

另一个说明__declspec关键字的示例:

在编写Windows Kernel Driver时,有时您想使用内联汇编代码编写自己的序言/结尾代码序列,因此可以使用属性声明函数。

__declspec( naked ) int func( formal_parameters ) {}

要么

#define Naked __declspec( naked )
Naked int func( formal_parameters ) {}

请参考裸(C ++)


8

本质上,这就是Microsoft引入其C ++扩展的方式,这样它们就不会与将来的标准C ++扩展冲突。使用__declspec,您可以为函数或类赋予属性。确切的含义因__declspec的性质而异。例如,__declspec(naked)禁止生成序言/后记(对于中断处理程序,可嵌入代码等),__declspec(thread)使变量成为线程局部变量,依此类推。

__declspec属性的完整列表在MSDN上可用,并且随编译器版本和平台的不同而不同。


1
考虑使用非Microsoft编译器,例如 GCC 4.2,除了是提供替代他们__attribute__ ((dllexport))__declspec(dllexport),是公平的呼吁__declspec,微软只延长?
user2338150

0

我知道已经八年了,但是我想分享在MRuby中发现的这段代码,该代码展示了如何__declspec()在与蜜蜂相同的水平上使用bee export keyword

/** Declare a public MRuby API function. */
#if defined(MRB_BUILD_AS_DLL)
#if defined(MRB_CORE) || defined(MRB_LIB)
# define MRB_API __declspec(dllexport)
#else
# define MRB_API __declspec(dllimport)
#endif
#else
# define MRB_API extern
#endif
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.