c++ 中__declspec 的用法详解

2020-01-06 15:59:00于丽

c++ 中__declspec 的用法如下,想要了解的继续往下看吧。

语法说明:

__declspec ( extended-decl-modifier-seq )

扩展修饰符:

1:align(#)

用__declspec(align(#))精确控制用户自定数据的对齐方式 ,#是对齐值。

e.g


__declspec(align(32)) 
struct Str1{
int a, b, c, d, e;
};

它与#pragma pack()是一对兄弟,前者规定了对齐的最小值,后者规定了对齐的最大值。同时出现时,前者优先级高。

__declspec(align())的一个特点是,它仅仅规定了数据对齐的位置,而没有规定数据实际占用的内存长度,当指定的数据被放置在确定的位置之后,其后的数据填充仍然是按照#pragma pack规定的方式填充的,这时候类/结构的实际大小和内存格局的规则是这样的:在__declspec(align())之前,数据按照#pragma pack规定的方式填充,如前所述。

当遇到__declspec(align())的时候,首先寻找距离当前偏移向后最近的对齐点(满足对齐长度为max(数据自身长度,指定值)),然后把被指定的数据类型从这个点开始填充,其后的数据类型从它的后面开始,仍然按照#pragma pack填充,直到遇到下一个__declspec(align())。当所有数据填充完毕,把结构的整体对齐数值和__declspec(align())规定的值做比较,取其中较大的作为整个结构的对齐长度。特别的,当__declspec(align())指定的数值比对应类型长度小的时候,这个指定不起作用。

2: allocate("segname")

用__declspec(allocate("segname")) 声明一个已经分配了数据段的一个数据项。它和#pragma 的code_seg, const_seg, data_seg,section,init_seg配合使用,segname必须有这些东东声明。

e.g


#pragma data_seg("share_data")
int a = 0;
int b;
#pragma data_seg() __declspec(allocate("share_data")) int c = 1;
__declspec(allocate("share_data")) int d;

3. deprecated 

用__declspec(deprecated ) 说明一个函数,类型,或别的标识符在新的版本或未来版本中不再支持,你不应该用这个函数或类型。它和#pragma deprecated作用一样。

e.g


#define MY_TEXT "function is deprecated"
void func1(void) {}
__declspec(deprecated) void func1(int) { printf("func1n");}
__declspec(deprecated("** this is a deprecated function **")) void func2(int) { printf("func2n");}
__declspec(deprecated(MY_TEXT)) void func3(int) { printf("func3");} 
int main()
{ 
fun1(); 
fun2(); 
fun3();
}

4.dllimport 和dllexport

用__declspec(dllexport),__declspec(dllimport)显式的定义dll接口给调用它的exe或dll文件,用 dllexport定义的函数不再需要(.def)文件声明这些函数接口了。注意:若在dll中定义了模板类那它已经隐式的进行了这两种声明,我们只需在 调用的时候实例化即可,呵呵。