我在正在阅读的代码中看到了 __declspec的实例。这是什么?我什么时候需要使用这个结构?
__declspec
这是微软对 C + + 语言的特定扩展,允许您使用存储类信息为类型或函数赋予属性。
文件
(C + +)
规范的例子是 __declspec(dllimport)和 __declspec(dllexport),它们指示链接器从 DLL 导入和导出符号(分别)。
__declspec(dllimport)
__declspec(dllexport)
// header __declspec(dllimport) void foo(); // code - this calls foo() somewhere in a DLL foo();
(__declspec(..)只是包装了微软的一些特性——为了实现兼容性,人们通常会用宏来包装它)
__declspec(..)
从本质上讲,这是微软引入 C + + 扩展的方式,这样它们就不会与未来标准 C + + 的扩展发生冲突。使用 _ _ decspec,您可以为函数或类赋予属性; 确切的含义取决于 _ _ decspec 的性质。例如,_ _ decspec (裸)会抑制 prolog/pilog 生成(用于中断处理程序、可嵌入代码等) ,_ _ decspec (thread)会生成一个变量 thread-local,等等。
_ _ decspec 属性的完整列表在 MSDN 上可用,并且因编译器版本和平台的不同而有所不同。
它主要用于将符号从/导出符号导入到共享库(DLL)。VisualC + + 和 GCC 编译器都支持 __declspec(dllimport)和 __declspec(dllexport)。其他用途(一些只有微软使用)有 在 MSDN 中文档。
另一个说明 解释规范关键字的例子:
在编写 Windows 内核驱动程序时,有时需要编写自己的 prolog/pilog 代码序列 使用内联汇编密码,这样就可以使用 裸体属性声明函数。
__declspec( naked ) int func( formal_parameters ) {}
或者
#define Naked __declspec( naked ) Naked int func( formal_parameters ) {}
请参阅 裸体(C + +)
我知道已经过去八年了,但是我想分享在 MRuby 中找到的这段代码,它展示了 __declspec()是如何被用在与 export keyword相同的级别上的。
__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