_declspec用法_第1页
_declspec用法_第2页
_declspec用法_第3页
_declspec用法_第4页
_declspec用法_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、方式的修饰符如static与extern等是C和C+语言的ANSIDO,而_declspecOODD展属性的定义。扩展属性语法简化并标准化了COC+语言关于Microsoft的扩展。用法:_declspec(extended-decl-modifier)extended-decl-modifier参数如下,可同时出现,中间有空格隔开:align(C+)allocateappdomaindeprecated(C+)dllimportdllexportjitintrinsicnaked(C+)noaliasnoinlinenoreturnnothrow(C+)novtableprocessprop

2、erty(C+)restrictselectanythreaduuid(C+)l._declspec关键字应该出现在简单声明的前面。对于出现在*或&后面或者变量声明中标识符的前面的_declspec,编译器将忽略并且不给出警告。2.要注意区分_declspec是修饰类型还是修饰变量:declspec(align(8)structStrb;修饰的是变量b。其它地方定义的structStr类型的变量将不受_declspec(align(8)影响。_declspec(align(8)structStr;修饰的是structStr类型。所有该类型的变量都受_declspec(align(8)影响。al

3、ign:格式:_declspec(align(n)declarator其中,n是对齐参数,其有效值是的整数次幂(从到字节),如,或。参数declarator是要设置对齐方式的数据。1.使用_declspec(align(n)来精确控制用户自定义数据的对齐方式。你可以在定义struct,union,class或声明变量时使用_declspec(align(n)。2.不能为函数参数使用_declspec(align(n)。3.如果未使用_declspec(align(#),编译器将根据数据大小按自然边界对齐。如字节整数按字节边界对齐;字节double按字节边界对齐。类或结构体中的数据,将取数据本身

4、的自然对齐方式和#pragmapack(n)设置的对齐系数中的最小值进行对齐。4._declspec(align(n)和#pragmapack(n)是一对兄弟,前者规定了对齐系数的最小值,后者规定了对齐系数的最大值。5.当两者同时出现时,前者拥有更高的优先级。即,当两者同时出现且值矛盾时,后者将不起作用。6.ODOsize大于等于#pragmapack(n)指定的n,而且_declspec(align(n)指定的数值比对应类型长度小的时候,这个declspec(align(n)指定将不起作用。7.当#pragmapack(n)指定的值n大于等于所有数据成员sizeODD,这个值n将不起作用。a

5、llocate:格式:_declspec(allocate(segname)declarator为数据指定存储的数据段。数据段名必须为以下列举中的一个:code_segconst_segdata_seginit_segsectionappdomain:指定托管程序中的每个应用程序域都要有一份指定全局变量或静态成员变量的拷贝。deprecated:与#pragmadeprecated()O作用相同。用于指定函数的某个重载形式是不推荐的。当在程序中调用了被deprecated修饰的函数时,编译器将给出C4996警告,并且可以指定具体的警告信息。该警告信息可以来源于定义的宏。例如:/compilew

6、ith:/W3#defineMY_TEXTfunctionisdeprecatedvoidfunc1(void)declspec(deprecated)voidfunc1(int)declspec(deprecated(*thisisadeprecatedfunction*)voidfunc2(int)declspec(deprecated(MY_TEXT)voidfunc3(int)intmain()func1();funcl(l);/C4996,警告信息:warningC4996:func1:wasdeclareddeprecatedfunc2(l);/C4996,警告信息:warning

7、C4996:func2:*thisisadeprecatedfunction*func3(l);/C4996,警告信息:warningC4996:func3:functionisdeprecateddllimport,dllexport:格式:_declspec(dllimport)declarator_declspec(dllexport)declarator分别用来从dll导入函数,数据,或对象以及从dll中导出函数,数据,或对象。相当于定义了dll的接口,为它的客户exe或dll定义可使用的函数,数据,或对象。将函数声明成dllexport就可以免去定义模块定义(.DEF)文件。dlle

8、xport代替了_export关键字。被声明为dllexport的C+函数导出时的函数名将会按照C+规则经过处理。如果要求不按照C+规则进行名字处理,请使用.def00000externC。jitintrinsic:格式:_declspec(jitintrinsic)用于标记一个函数或元素是位通用语言运行时使用jitintrinsic会在函数签名中加入naked:格式:_declspec(naked)declarator此关键字仅用于x86系统,多用于虚拟设备驱动。含任何注释或标记。仅可以对函数的定义使用,(CLR)。主要用于Microsoft提供的某些库中。MODOPT(IsJitIntri

9、nsic)。此关键字可以使编译器在生成代码时不包不能用于数据声明、定义,或者函数的声明。noalias:仅适用于函数,它指出该函数是半纯粹的函数。半纯粹的函数是指仅引用或修改局部变量、参数和第一层间接参数。它是对编译器的一个承诺,如果该函数引用全局变量或第二层间接指针参数,则编译器会生成中断应用程序的代码。restrict:格式:_declspec(restrict)return_typef();仅适用于返回指针的函数声明或定义,如,CRT的malloc函数:_declspec(restrict)void*malloc(size_tsize);它告诉编译器该函数返回的指针不会与任何其它的指针混

10、淆。它为编译器提供执行编译器优化的更多信息。对于编译器来说,最大的困难之一是确定哪些指针有必要指出,这是对编译器的一个_declspec(restrict),则会与其它指针混淆,而使用这些信息对编译器很有帮助。承诺,编译器并不对其进行验证。如果您的程序不恰当地使用该程序的行为会不正确。noinline:格式:return-type_declspec(nothrow)call-conventionfunction-name因为在类定义中定义的成员函数默认都是inline的,_declspec(naked)用于显式指定类中的某个函数不需要inline(内联)。如果一个函数很小而且对系统性能影响不大

11、,有必要将其声明为非内敛的。例如,用于处理错误情况的函数。noreturn:一个函数被_declspec(noreturn)所修饰,那么它的含义是告诉编译器,这个函数不会返回,C2202其结果是让编译器知道被修饰为_declspec(noreturn)的函数之后的代码不可到达。如果编译器发现一个函数有无返回值的代码分支,编译器将会报C4715警告,或者错误信息。如果这个代码分支是因为函数不会返回从而无法到达的话,可以使用约定_declspec(noreturn)来避免上述警告或者错误。将一个期望返回的函数约定为_declspec(noreturn)将导致未定义的行为。在下面的这个例子中,mai

12、n00000else分支返回,所以约定函数fatal为_declspec(noreturn)来避免编译或警告信息。_declspec(noreturn)externvoidfatal()intmain()if(1)return1;elseif(0)return0;elsefatal();nothrow:(argument-list)可用于函数声明。告诉编译器被声明的函数以及函数内部调用的其它函数都不会抛出异常。novtable:可用于任何类声明中,但最好只用于纯接口类,即类本身从不实例化。此关键字的声明将阻止编译器对构造和析构函数的vfptr的初始化。可优化编译后代码大小。如果试图实例化一个用

13、_declspec(novtable)声明的类然后访问类中成员,则会在运行时产生访问错误(accessviolation,即AV)。格式:return-type_declspec(nothrow)call-conventionfunction-name因为在类定义中定义的成员函数默认都是inline的,_declspec(naked)用于显式指定类中格式:return-type_declspec(nothrow)call-conventionfunction-name因为在类定义中定义的成员函数默认都是inline的,_declspec(naked)用于显式指定类中process:表示你的托管

14、应用程序进程应该拥有一份指定全局变量,静态成员变量,或所有应用程序域共享的静态本地变量的拷贝。在使用/clr:pure进行编译时,应该使用_declspec(process),因为使用/clr:pure进行编译时,在默认情况下,每个应用程序域拥有一份全局和静态变量的拷贝。在使用/clr进行编译时,不必使用declspec(process),格式:return-type_declspec(nothrow)call-conventionfunction-name因为在类定义中定义的成员函数默认都是inline的,_declspec(naked)用于显式指定类中格式:return-type_decl

15、spec(nothrow)call-conventionfunction-name因为在类定义中定义的成员函数默认都是inline的,_declspec(naked)用于显式指定类中因为使用_declspec(process)修/clr进行编译时,在默认情况下,每个进程有一份全局和静态变量的拷贝。只有全局变量,静态成员变量,或本地类型的本地静态变量可以用饰。在使用/clr:pure进行编译时,被声明为_declspec(process)的变量同时也应该声明为格式:return-type_declspec(nothrow)call-conventionfunction-name因为在类定义中定义

16、的成员函数默认都是inline的,_declspec(naked)用于显式指定类中格式:return-type_declspec(nothrow)call-conventionfunction-name因为在类定义中定义的成员函数默认都是inline的,_declspec(naked)用于显式指定类中appdomain。const类型。如果想每个应用程序域拥有一份全局变量的拷贝时,请使用property:格式:_declspec(property(get=get_func_name)declarator因为在类定义中定义的成员函数默认都是inline的,_declspec(naked)用于显式

17、指定类中_declspec(property(put=put_func_name)declarator_declspec(property(get=get_func_name,put=put_func_name)declarator该属性可用于类或结构定义中的非静态“虚数据成员”。实际上就是做了一个映射,把你的方法映射成属性,以供访问。get和put就是属性访问的权限,一个是读的权限,一个是写的权限。当编译器看到被property修饰的数据成员出现在成员选择符(.或)的右边的时候,它将把该操作转换成get或put方法。该修饰符也可用于类或结构定义中的空数组。用法如下:structSinti;v

18、oidputprop(intj)i=j;intgetprop()returni;_declspec(property(get=getprop,put=putprop)intthe_prop;intmain()Ss;s.the_prop=5;returns.the_prop;selectany:格式:_declspec(selectany)declarator在MFC,ATL的源代码中充斥着_declspec(selectany)的声明。selectany可以让我们在.h文件中初始化一个全局变量而不是只能放在.cpp中。比如有一个类,其中有一个静态变量,那么我们可以在.h中通过类似_declsp

19、ec(selectany)typeclass:variable=value;这样的代码来初始化这个全局变量。既是该.h被多次include,链接器也会为我们剔除多重定义的错误。对于template的编程会有很多便利。用法如下:_declspec(selectany)intxl=l;/正确,xl被初始化,并且对外部可见const_declspec(selectany)intx2=2;/错误,在C+中,默认情况下const为static;但在C中是正确的,其默认情况下const不为staticexternconst_declspec(selectany)intx3=3;/正确,x3是externc

20、onst,对外部可见externconstintx4;const_declspec(selectany)intx4=4;/正确,x4是externconst,对外部可见extern_declspec(selectany)intx5;/错误,x5未初始化,不能用_declspec(selectany)修饰classXpublic:X(inti)i+;inti;_declspec(selectany)Xx(1);/正确,全局对象的动态初始化thread:格式:_declspec(thread)declarator声明declarator为线程局部变量并具有线程存储时限,以便链接器安排在创建线程时自动分配的存储。线程局部存储(TLS)是一种机制,在多线程运行环境中,每个线程分配自己的局部数据。在标准多线程程序中,数据是在多个线程间共享的,而TLS是一种为每个线程分配

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论