我在我正在阅读的代码中看到了__declspec
的实例。它是什么?我什么时候需要使用这个构造?
答案 0 :(得分:68)
答案 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