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

时间:2010-02-17 21:42:48

标签: c++

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

6 个答案:

答案 0 :(得分:68)

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

文档

__declspec (C++)

答案 1 :(得分:45)

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

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


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

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

答案 2 :(得分:18)

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

答案 3 :(得分:12)

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

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

__declspec( naked ) int func( formal_parameters ) {}

或者

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

请参阅naked (C++)

答案 4 :(得分:6)

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

MSDN上提供了__declspec属性的完整列表,并且因编译器版本和平台而异。

答案 5 :(得分:0)

我知道已经八年了,但我想分享一下在MRuby中找到的这段代码,其中显示__declspec()如何与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