_declspec用法
cl.exe_link.exe用法详解[选项说明]
![cl.exe_link.exe用法详解[选项说明]](https://img.taocdn.com/s3/m/04a34101de80d4d8d15a4ff2.png)
option : 一个或多个 CL 选项。请注意,所有选项都应用于所有指定的源文件。选项是由一 个 正斜杠 (/) 或一个短划线 (-) 指定的。如果某个选项带有参数,则该选项的说明指 定在选项和参数之间是否允许有空格。选项名(/HELP 选项除外)区分大小写。有关 更多信息,请参见 CL 选项的顺序。 /c : 编译但不链接 /Zs : 检查语法 /? : 列出编译器选项 /arch : 使用 SSE 或 SSE2 指令生成代码 /arch:SSE2 /clr : 启用 C++ 的托管扩展并产生在公共语言运行库上运行的输出文件 /F : 设置堆栈大小 | 此选项设置程序堆栈大小(以字节为单位)。 如果不使用此选项,堆栈大小默认为 1 MB /F 100 /Fe : 重命名可执行文件 /Feexe.exe /G7 :针对 Pentium 4 或 Athlon 优化代码。 /GA :优化 Windows 应用程序的代码 /GL :启用全程序优化 /Gm :启用最小重新生成 /HELP :列出编译器选项 /I :在目录中搜索包含文件 | 指定源文件目录 include /I"e:\VC\include"
uuid.lib odbc32.lib odbccp32.lib OpenGL32.Lib
LCF文件使用说明

序言:Codewarrior 是飞思卡尔32位汽车级单片机Qorriva 系列的集成开发环境,与之前版本、完全兼容。
Codewarrior 是飞思卡尔最新的集成开发环境,是一个开放源代码的、基于Java 的可扩展开发平台。
许多新用户对codewarrior 链接文件不是十分了解,本文将针对链接文件的常见问题以及段的定义进行介绍帮助用户快速了解和使用CodeWarrior 。
目录第一节 LCF 文件定义及使用说明1: LCF 文件介绍2:LCF 文件中各个预定义段的说明 3:常用关键字和宏定义说明第二节 EPPC 链接器介绍及使用说明 第三节 代码重定向第一节 LCF 文件定义及使用说明1:LCF 文件介绍链接文件用来控制不同类型数据代码、数据以某种排列方式在最终在生成的可执行文件或者二进制文件,调试文件中的放置位置。
它可以通过在EPPC linker 的面板中进行配置,也可以直接在lcf 文件中直接进行修改。
Lcf 文件中首先是对整个memory map(MEMORY )地址空间内的所有RAM,ROM 进行分割,将其分为几个区域,便于放置不同类型的存储内容,而这些区域内包含的内容可以是用户自定义的段或者系统预定义的段(SECTION )。
关于段的定义和使用将在lcf 文件介绍结束后进行介绍。
一个工程通常在建立的时候默认的调试方式都是在RAM 中进行调试,由于RAM中执行的效率高于FLASH ,并且下载速度快。
在生成的ROM Image中常量,初始化过的数据或者代码如果没有被定义在ROM区域则假设为这部分代码要在程序开始执行的时候从ROM去拷贝到RAM区。
下面是一个完整的lcf文件,其中包括每行的解释及用法。
/* lcf file for MPC5604B M27V (debug RAM version) 文件的名字及对应单片机(RAM版本) */{}”中是内容部分.init : {} nit_vle (VLECODE) : { nit) *(.init_vle)}} > init GROUP中的所有内容vor_branch_table (VLECODE) ALIGN (4096) : {} _exception_handlers (VLECODE) LOAD(_e_ivor_branch_table) : {}ext (TEXT) ALIGN(0x10) : {}.text_vle (VLECODE) ALIGN(0x10): {*(.text)*(.text_vle)}.rodata (CONST) : {*(.rdata)*(.rodata)}.ctors : {}.dtors : {}extab : {}extabindex : {}} > pseudo_romGROUP : {.__uninitialized_intc_handlertable ALIGN(0x10) : {}.data : {}.sdata : {}.sbss : {}.sdata2 : {}.sbss2 : {}.bss : {}} > internal_ram}/* Freescale CodeWarrior compiler address designations */_stack_addr = ADDR(stack)+SIZEOF(stack);3.常用关键字及使用说明关键字列表:1) SECTION2) ALIGN3) ADDR4) SIZEOF5) LOAD6) BIND7)Declspec8)pop, push9)FORCEACTIVE1)SECTIONSection使用pragma来将编译的目标代码放到预定义的段中,然后可以在LCF文件中将对应的段放到指定的地址区域。
_stdcall介绍

stdcall调用约定:stdcall很多时候被称为pascal调用约定,因为pascal是早期很常见的一种教学用计算机程序设计语言,其语法严谨,使用的函数调用约定就是stdcall。
在Microsoft C++系列的C/C++编译器中,常常用PASCAL宏来声明这个调用约定,类似的宏还有WINAPI和CALLBACK。
stdcall调用约定声明的语法为(以前文的那个函数为例):int __stdcall function(int a,int b)stdcall的调用约定意味着:1)参数从右向左压入堆栈,2)函数自身修改堆栈 3)函数名自动加前导的下划线,后面紧跟一个@符号,其后紧跟着参数的尺寸。
以上述这个函数为例,参数b首先被压栈,然后是参数a,函数调用function(1,2)调用处翻译成汇编语言将变成:push 2 第二个参数入栈push 1 第一个参数入栈call function 调用参数,注意此时自动把cs:eip入栈而对于函数自身,则可以翻译为:push ebp 保存ebp寄存器,该寄存器将用来保存堆栈的栈顶指针,可以在函数退出时恢复mov ebp,esp 保存堆栈指针mov eax,[ebp + 8H] 堆栈中ebp指向位置之前依次保存有ebp,cs:eip,a,b,ebp +8指向aadd eax,[ebp + 0CH] 堆栈中ebp + 12处保存了bmov esp,ebp 恢复esppop ebpret 8而在编译时,这个函数的名字被翻译成_function@8注意不同编译器会插入自己的汇编代码以提供编译的通用性,但是大体代码如此。
其中在函数开始处保留esp到ebp中,在函数结束恢复是编译器常用的方法。
从函数调用看,2和1依次被push进堆栈,而在函数中又通过相对于ebp(即刚进函数时的堆栈指针)的偏移量存取参数。
函数结束后,ret 8表示清理8个字节的堆栈,函数自己恢复了堆栈。
DLL编程入门

用C++进行DLL编程入门一、编写第一个入门级dll文件1. 新建一个dlltest的dll工程,加入一源文件dlltest.cpp,包含add和subtract两个函数如下:_declspec(dllexport) int add(int a,int b){return a+b;}_declspec(dllexport) int subtract(int a,int b){return a-b;}//----------------------------------------------------------------注意:在函数名前加上_declspec(dllexport),这样编译后在连接的时候才会生成dlltest.lib (引入库文件)和dlltest.exp(输出库文件),并且在命令提示符下用dumpbin命令可以看到导出了哪些函数。
方法:在命令提示符下,转到dll文件所在目录下,输入dumpbin –exports dlltest.dll,列出导出函数如下:这里注意到函数名字已经被改成了?add@@YAHHH@Z,这种现象叫做名字粉碎,是为了支持函数重载而做的。
2.编写一个基于对话框的MFC程序测试DLL,工程名为calldll,放置两个按纽add和subtract,响应按纽消息,调用这个DLL的add和subtract函数。
先添加响应按钮消息的函数OnAdd和OnSubtract,然后在函数所在源文件中写完整函数体如下://extern int add(int,int);//extern int subtract(int,int);_declspec(dllimport) int add(int,int);_declspec(dllimport) int subtract(int,int);void CCalldllDlg::OnAdd(){// TODO: Add your control notification handler code hereCString str;str.Format("2+3=%d",add(2,3));MessageBox(str);}void CCalldllDlg::OnSubtract(){// TODO: Add your control notification handler code hereCString str;str.Format("3-2=%d",subtract(3,2));MessageBox(str);}//------------------------------------------------------------这里采用隐式链接的方式加载动态链接库:注意:要用关键字extern先声明这两个函数,表明这两个函数是在外部定义的(不过程序中将它注释掉了)。
LCF文件使用说明

Codewarrior 2。
10是飞思卡尔32位汽车级单片机Qorriva系列的编译器,与之前版本2。
8、2。
9完全兼容。
许多新用户对codewarrior链接文件不是十分了解,本文将针对链接文件的常见问题以及段的定义进行介绍帮助用户快速了解和使用CodeWarrior。
LCF 文件定义及用法介绍链接文件用来控制不同类型数据代码、数据以某种排列方式在最终在生成的可执行文件或者二进制文件,调试文件ROMSECTIONS段的定义{GROUP : {// 它的定义需要遵从本例程方式”GROUP:{}” .“{}”中是内容部分.init : {} //.init段中所有内容。
init_vle (VLECODE) :{ //.init_vle(使用VLE代码)*(。
init)*(。
init_vle)}} 〉init//可以参看前面的init段在存储空间的定义.本GROUP中的所有内容放在init段中,”>”代表放在哪个段GROUP :{.ivor_branch_table (VLECODE) ALIGN (4096):{} //ALIGN(4096)按照4096字节对齐.__exception_handlers (VLECODE) LOAD (_e_ivor_branch_table): {}// LOAD()将本段加载到指定地址} 〉exception_handlersGROUP : {。
text (TEXT) ALIGN(0x10): {}.text_vle (VLECODE)ALIGN(0x10): {*(.text)*(.text_vle)}.rodata (CONST): {*(.rdata)*(.rodata)}.ctors :{}。
dtors :{}extab : {}extabindex : {}}> pseudo_romGROUP :{。
__uninitialized_intc_handlertable ALIGN(0x10) :{}.data :{}。
C++_虚构造函数和虚析构函数

delete pf; //OK, ultimately invokes File::~File()
在某些情况下定义其它纯虚成员函数可能也是非常有用的(比如说在调试应用程序以及记录应用程序的日志时)。例如,在一个不应该被调用,但是由于一个缺陷而被调用的基类中,如果有一个纯虚成员函数,那么我们可以为它提供一个定义。
return 3;
}
};
class Wrap
{
public:
Wrap(string key){
if(key=="a") m_obj= new A(key);
if(key=="b") m_obj= new B(key);
{
Shape* s2=s.clone();
Shape* s3=s.create();
// ...
delete s2; //在此处,你可能需要虚析构函数
delete s3;
}
这个函数将正确工作,而不管Shape是一个Circle,Square,或是其他种类的Shape,甚至它们还并不存在。
纯虚成员函数通常没有定义;它们是在抽象类中声明,然后在派生类中实现。比如说下面的例子:
class File //an abstract class
{
public:
virtual int open(const string & path, int mode=0x666)=0;
virtual int close()=0;
}
这样,我们就可以记录所有对纯虚函数的调用,并且还可以定位错误代码;不为纯虚函数提供定义将会导致整个程序无条件地终止。
CC++编译器-cl.exe的命令选项

C/C++编译器-cl.exe的命令选项和在IDE中编译相比,命令行模式编译速度更快,并可以避免被IDE产生的一些附加信息所干扰。
本文将介绍微软C/C++编译器命令行模式设定和用法。
1、设置环境变量:PA TH=C:\Program Files\Microsoft Visual Studio 8\VC\binINCLUDE=C:\Program Files\Microsoft Visual Studio 8\VC\include LIB=C:\Program Files\Microsoft Visual Studio 8\VC\lib如果提示找不到mspdb80.dll文件,则从C:\Program Files\Microsoft Visual Studio 8\Common7\IDE下拷贝“msobj80.dll,mspdb80.dll,mspdbcore.dll,mspdbsrv.exe”这四个文件到C:\Program Files\Microsoft Visual Studio 8\VC\bin下即可。
2、命令选项:1) /C:在预处理输出中保留注释语句2) /c:只编译,不连接,相当于在"Build"菜单下选择了"Compile"3) /D:定义常量和宏,与源程序里的#define 有相同效果4) /E:预处理C、C++源文件,将源文件中所有的预编译指令及宏展开,将注释去掉,然后将预处理器的输出拷贝至标准输出设备输出,并且在每个文件的开头和末尾加入#line5) /EH:指定编译器用何种异常处理模型6) /EP:同/E,只是去掉了#line7) /F:设置程序的堆栈大小8) /FA:设置生成何种列表文件(汇编、汇编与机器码、汇编与源码、汇编与机器码以及源码)9) /Fa:指定用/FA设置的列表文件的存放路径及(或)文件名10) /FD:生成文件的相互依赖信息11) /Fd:设置程序数据库文件(PDB)的存放路径及(或)文件名12) /Fe:设置最终可执行文件的存放路径及(或)文件名13) /FI:预处理指定的头文件,与源文件中的#include有相同效果14) /Fm:创建map文件15) /Fo:设置编译后Obj文件的存放路径及(或)文件名16) /Fp:设置预编译文件(pch)的存放路径及(或)文件名17) /FR:生成浏览信息(sbr)文件18) /Fr:同/FR,不同之处在于/Fr不包括局部变量信息19) /G3:为80386处理器优化代码生成20) /G4:为80486处理器优化代码生成21) /G5:为Pentium处理器优化代码生成22) /G6:为Pentium Pro处理器优化代码生成23) /GA:为Windows应用程序作优化24) /GB:为Pentium处理器优化代码生成,使用80386、80486、Pentium、Pentium Pro的混合指令集,是代码生成的默认选项(程序属性选项中Processor对应Blend)25) /GD:为Windows动态库(dll)作优化,此开关在VC6中没有实现26) /Gd:指定使用__cdecl的函数调用规则27) /Ge:激活堆栈检测28) /GF:消除程序中的重复的字符串,并将她放到只读的缓冲区中29) /Gf:消除程序中的重复字符串30) /Gh:在每个函数的开头调用钩子(hook)函数--penter31) /Gi:允许渐进编译32) /Gm:允许最小化rebuild33) /GR:允许运行时类型信息(Run-Time Type Infomation)34) /Gr:指定使用__fastcall的函数调用规则35) /Gs:控制堆栈检测所用内存大小36) /GT:支持用__declspec(thread)分配的数据的fier-safety37) /GX:允许同步异常处理,与/EHsc开关等价38) /Gy:允许编译器将每一个函数封装成COMDA Ts的形式,供连接器调用39) /GZ:允许在Debug build 的时候捕捉Release build的错误40) /Gz:指定使用__stdcall的函数调用规则41) /H:限制外部名字的长度42) /HELP:列出编译器的所有的命令开关43) /I:指定头文件的搜索路径44) /J:将char的缺省类型从signed char改成unsigned char45) /LD:创建一个动态连接库46) /LDd:创建一个Debug版本的动态链接库47) /link:将指定的选项传给连接器48) /MD:选择多线程、DLL版本的C Run-Time库49) /MDd:选择多线程、DLL、Debug版本的C Run-Time库50) /ML:选择单线程版本的C Run—Time库51) /MLd:选择单线程、Debug版本的C Run—Time库52) /MT:选择多线程版本的C Run-Time库53) /MTd:选择多线程、Debug版本的C Run—Time库54) /nologo:不显示程序的版权信息55) /O1:优化使产生的可执行代码最小56) /O2:优化使产生的可执行代码速度最快57) /Oa:指示编译器程序里没有使用别名,可以提高程序的执行速度58) /Ob:控制内联(inline)函数的展开59) /Od:禁止代码优化60) /Og:使用全局优化61) /Oi:用内部函数去代替程序里的函数调用,可以使程序运行的更快,但程序的长度变长62) /Op:提高浮点数比较运算的一致性63) /Os:产生尽可能小的可执行代码64) /Ot:产生尽可能块的可执行代码65) /Ow:指示编译器在函数体内部没有使用别名66) /Ox:组合了几个优化开关,达到尽可能多的优化67) /Oy:阻止调用堆栈里创建帧指针68) /Q1f:对核心级的设备驱动程序生成单独的调试信息69) /QI0f:对Pentium 0x0f错误指令作修正70) /Qifdiv:对Pentium FDIV错误指令作修正71) /P:将预处理输出写到指定文件里,文件的后缀名为I72) /TC:将命令行上的所有文件都当作C源程序编译,不管后缀名是否为.c73) /Tc:将指定的文件当作C源程序编译,不管后缀名是否为.c74) /TP:将命令行上的所有文件都当作C++源程序编译,不管后缀名是否为.cpp75) /Tp:将指定文件当作C++源程序编译,不管后缀名是否为.cpp76) /U:去掉一个指定的前面定义的符号或常量77) /u:去掉所有前面定义的符号或常量78) /V:在编译的obj文件里嵌入版本号79) /vd:禁止/允许构造函数置换80) /vmb:选择指针的表示方法,使用这个开关,在声明指向某个类的成员的指针之前,必须先定义这个类81) /vmg:选择指针的表示方法,使用这个开关,在声明指向某个类的成员的指针之前,不必先定义这个类,但要首先指定这个类是使用何种继承方法82) /vmm:设置指针的表示方法为Single Inheritance and MultipleInheritance83) /vms:设置指针的表示方法为Single Inheritance84) /vmv:设置指针的表示方法为Any class85) /W:设置警告等级86) /w:禁止所有警告87) /X:阻止编译器搜索标准的include 目录88) /Yc:创建预编译头文件(pch)89) /Yd:在所有的obj文件里写上完全的调试信息90) /Y u:在build过程中使用指定的预编译头文件91) /YX:指示编译器若预编译头文件存在,则使用它,若不存在,则创建一个92) /Z7:生成MSC7.0兼容的调试信息93) /Za:禁止语言扩展(Microsoft Extensions to C)94) /Zd:调试信息只包含外部和全局的符号信息以及行号信息95) /Ze:允许语言扩展(Microsoft Extensions to C)96) /Zg:为源文件里面定义的每个函数生成函数原型97) /ZI:生成程序库文件(Pdb)并支持Edit and Continue调试特性98) /Zi:生成程序库文件(pdb),包含类型信息和符号调试信息99) /ZL:从obj文件里去掉缺省的库文件名100) /Zm:设置编译器的内存分配xianzhi101) /Zn:禁止浏览信息文件里面的封装102) /Zp:设置结构成员在内存里面的封装格式103) /Zs:快速检查语法错误--------------------------vc所支持的文件类型1) DSW:全称是Developer Studio Workspace,最高级别的配置文件,记录了整个工作空间的配置信息,她是一个纯文本的文件,在vc创建新项目的时候自动生成2) DSP:全称是Developer Studio Project,也是一个配置文件,不过她记录的是一个项目的所有配置信息,纯文本文件3) OPT:与DSW、DSP配合使用的配置文件,她记录了与机器硬件有关的信息,同一个项目在不同的机器上的opt文件内容是不同的4) CL W:记录了跟ClassWizard相关的信息,如果丢失了clw文件,那么在Class View面板里就没有类信息5) PLG:实际上是一个超文本文件,可以用Internet Explorer打开,记录了Build的过程,是一个日志型文件6) RC:资源描述文件,记录了所有的资源信息,在资源编辑器里作的修改,实际上都是对RC文件的修改7) RC2:附加的资源描述文件,不能直接资源编辑器修改,只能手工添加,可以用来添加额外的资源8) RES:经过资源编辑器编译之后的资源文件,以二进制方式存放9) SBR:编译器生成的浏览信息文件,在代码导航的时候非常有用,她需要在编译时指定/FR或者/Fr开关10) BSC:BSCMAKE.EXE将所有的SBR文件作为输入,经过处理之后输出一个BSC文件,在代码导航的时候实际用到的是BSC 文件11) ILK:当选定渐增型编译连接时,连接器自动生成ILK文件,记录连接信息12) PDB:全称是Program DataBase,即程序数据库文件,用来记录调试信息,是一个相当重要的文件,没有他,程序无法正常调试13) LIB:如果项目输出是Dll的话,一般会输出一个跟项目同名的Lib文件,记录输出的函数信息14) EXP:同Lib,是跟Dll一起生成的输出文件15) PCH:全称是PreCompiled Header,就是预先编译好的头文件,在编译时指定/Y u开关时编译器自动生成VC++编译器中一些常见precompiling 指令介绍我们在利用vc6.0 project wizard生成的代码中,经常看到大量的precompiling指令。
type = noload的用法

类型(type)是编程语言中的一个重要概念,它定义了数据的形式和可对数据进行的操作。
在一些编程语言中,类型限制了数据的存储方式和可执行的操作,而在其他语言中,类型可以隐式转换或者根据需要进行转换。
在本文中,我们将探讨一种特殊类型noload,以及它在编程中的用法。
1. noload的定义noload是一种不常见的类型,在一些特定的编程环境中才会出现。
通常来说,noload类型用于指示编译器在加载一个模块或者库时不要加载特定的函数或者变量。
这通常用于解决模块之间的依赖关系或者减少加载时间。
2. noload的使用场景noload类型常常在大型软件系统中出现,特别是当有多个模块互相依赖,而其中某些函数或者变量实际上并不需要被加载时。
在这种情况下,使用noload类型可以有效地减少系统的加载时间和内存占用。
3. noload的语法在大多数编程语言中,noload类型的语法通常比较简单。
在C语言中,可以使用关键字__declspec(noload)来标记一个函数或者变量,告诉编译器在加载时不要加载它。
在其他语言中,可能会有一些特定的语法来实现类似的功能,但基本原理是一样的。
4. noload的注意事项虽然noload类型可以在一些情况下带来性能上的提升,但它并不是一个被广泛使用的特性。
在使用noload类型时,需要慎重考虑其对系统整体的影响,特别是在模块间的依赖关系和程序的正确性方面。
noload类型是一种特殊的类型,它在编程中的用法主要是用于告诉编译器在加载模块或者库时不要加载特定的函数或者变量。
虽然它可以在一定程度上提升系统的性能,但它并不是一个被广泛使用的特性。
在使用noload类型时,需要根据具体情况慎重考虑其对系统整体的影响。
noload类型的使用虽然在一般情况下并不常见,但它在特定的编程环境中发挥着重要作用。
在实际的软件开发过程中,特别是在涉及大型软件系统或者复杂的模块间依赖关系时,合理地利用noload类型可以带来一些显著的好处。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
__declspec用于指定所给定类型的实例的与Microsoft相关的存储方式。
其它的有关存储方式的修饰符如static与extern等是C和 C++语言的ANSI规范,而__declspec是一种扩展属性的定义。
扩展属性语法简化并标准化了C和C++语言关于Microsoft的扩展。
用法:__declspec ( extended-decl-modifier )extended-decl-modifier参数如下,可同时出现,中间有空格隔开:align (C++)allocateappdomaindeprecated (C++)dllimportdllexportjitintrinsicnaked (C++)noaliasnoinlinenoreturnnothrow (C++)novtableprocessproperty(C++)restrictselectanythreaduuid(C++)1.__declspec关键字应该出现在简单声明的前面。
对于出现在*或&后面或者变量声明中标识符的前面的 __declspec,编译器将忽略并且不给出警告。
2.要注意区分__declspec是修饰类型还是修饰变量:__declspec(align(8)) struct Str b;修饰的是变量b。
其它地方定义的struct Str类型的变量将不受__declspec(align(8))影响。
__declspec(align(8)) struct Str {};修饰的是struct Str类型。
所有该类型的变量都受__declspec(align(8))影响。
align:格式:__declspec(align(n)) declarator其中,n是对齐参数,其有效值是的整数次幂(从到字节),如,,,,或。
参数declarator 是要设置对齐方式的数据。
1.使用__declspec(align(n))来精确控制用户自定义数据的对齐方式。
你可以在定义struct,union,class或声明变量时使用__declspec(align(n))。
2.不能为函数参数使用__declspec(align(n))。
3.如果未使用__declspec(align(#)),编译器将根据数据大小按自然边界对齐。
如字节整数按字节边界对齐;字节double按字节边界对齐。
类或结构体中的数据,将取数据本身的自然对齐方式和#pragma pack(n)设置的对齐系数中的最小值进行对齐。
4.__declspec(align(n))和#pragmapack(n)是一对兄弟,前者规定了对齐系数的最小值,后者规定了对齐系数的最大值。
5.当两者同时出现时,前者拥有更高的优先级。
即,当两者同时出现且值矛盾时,后者将不起作用。
6.当变量size大于等于#pragmapack(n)指定的n,而且__declspec(align(n))指定的数值n 比对应类型长度小的时候,这个__declspec(align(n))指定将不起作用。
7.当#pragmapack(n)指定的值n大于等于所有数据成员size的时候,这个值n将不起作用。
allocate:格式:__declspec(allocate("segname")) declarator为数据指定存储的数据段。
数据段名必须为以下列举中的一个:code_segconst_segdata_seginit_segsectionappdomain:指定托管程序中的每个应用程序域都要有一份指定全局变量或静态成员变量的拷贝。
deprecated:与#pragmadeprecated()的作用相同。
用于指定函数的某个重载形式是不推荐的。
当在程序中调用了被 deprecated修饰的函数时,编译器将给出C4996警告,并且可以指定具体的警告信息。
该警告信息可以来源于定义的宏。
例如:// compile with: /W3#defineMY_TEXT "function is deprecated"voidfunc1(void) {}__declspec(deprecated) void func1(int) {}__declspec(deprecated("** this is a deprecated function **")) void func2(int) {} __declspec(deprecated(MY_TEXT)) void func3(int) {}intmain() {func1();func1(1); // C4996,警告信息:warning C4996: 'func1': was declared deprecated func2(1); // C4996,警告信息:warning C4996: 'func2': ** this is a deprecated function **func3(1); // C4996,警告信息:warning C4996: 'func3': function is deprecated }dllimport,dllexport:格式:__declspec( dllimport ) declarator__declspec( dllexport ) declarator分别用来从dll导入函数,数据,或对象以及从dll中导出函数,数据,或对象。
相当于定义了dll的接口,为它的客户 exe或dll定义可使用的函数,数据,或对象。
将函数声明成dllexport就可以免去定义模块定义(.DEF)文件。
dllexport代替了__export关键字。
被声明为dllexport的C++函数导出时的函数名将会按照C++规则经过处理。
如果要求不按照C++规则进行名字处理,请使用.def文件或使用extern "C"。
jitintrinsic:格式:__declspec(jitintrinsic)用于标记一个函数或元素是位通用语言运行时(CLR)。
主要用于Microsoft提供的某些库中。
使用jitintrinsic会在函数签名中加入MODOPT(IsJitIntrinsic)。
naked:格式:__declspec(naked) declarator此关键字仅用于x86系统,多用于虚拟设备驱动。
此关键字可以使编译器在生成代码时不包含任何注释或标记。
仅可以对函数的定义使用,不能用于数据声明、定义,或者函数的声明。
noalias:仅适用于函数,它指出该函数是半纯粹的函数。
半纯粹的函数是指仅引用或修改局部变量、参数和第一层间接参数。
它是对编译器的一个承诺,如果该函数引用全局变量或第二层间接指针参数,则编译器会生成中断应用程序的代码。
restrict:格式:__declspec(restrict) return_type f();仅适用于返回指针的函数声明或定义,如,CRT的malloc函数:__declspec(restrict) void *malloc(size_t size);它告诉编译器该函数返回的指针不会与任何其它的指针混淆。
它为编译器提供执行编译器优化的更多信息。
对于编译器来说,最大的困难之一是确定哪些指针会与其它指针混淆,而使用这些信息对编译器很有帮助。
有必要指出,这是对编译器的一个承诺,编译器并不对其进行验证。
如果您的程序不恰当地使用 __declspec(restrict),则该程序的行为会不正确。
noinline:因为在类定义中定义的成员函数默认都是inline的,__declspec(naked)用于显式指定类中的某个函数不需要inline(内联)。
如果一个函数很小而且对系统性能影响不大,有必要将其声明为非内敛的。
例如,用于处理错误情况的函数。
noreturn:一个函数被__declspec(noreturn)所修饰,那么它的含义是告诉编译器,这个函数不会返回,其结果是让编译器知道被修饰为__declspec(noreturn)的函数之后的代码不可到达。
如果编译器发现一个函数有无返回值的代码分支,编译器将会报C4715警告,或者C2202错误信息。
如果这个代码分支是因为函数不会返回从而无法到达的话,可以使用约定__declspec(noreturn)来避免上述警告或者错误。
将一个期望返回的函数约定为__declspec(noreturn)将导致未定义的行为。
在下面的这个例子中,main函数没有从else分支返回,所以约定函数fatal为__declspec(noreturn)来避免编译或警告信息。
__declspec(noreturn) extern void fatal () {}intmain() {if(1)return 1;elseif(0)return 0;elsefatal();}nothrow:格式:return-type __declspec(nothrow) [call-convention] function-name ([argument-list])可用于函数声明。
告诉编译器被声明的函数以及函数内部调用的其它函数都不会抛出异常。
novtable:可用于任何类声明中,但最好只用于纯接口类,即类本身从不实例化。
此关键字的声明将阻止编译器对构造和析构函数的 vfptr的初始化。
可优化编译后代码大小。
如果试图实例化一个用__declspec(novtable)声明的类然后访问类中成员,则会在运行时产生访问错误 (access violation,即AV)。
process:表示你的托管应用程序进程应该拥有一份指定全局变量,静态成员变量,或所有应用程序域共享的静态本地变量的拷贝。
在使用 /clr:pure进行编译时,应该使用__declspec(process),因为使用/clr:pure进行编译时,在默认情况下,每个应用程序域拥有一份全局和静态变量的拷贝。
在使用/clr进行编译时,不必使用__declspec(process),因为使用/clr进行编译时,在默认情况下,每个进程有一份全局和静态变量的拷贝。
只有全局变量,静态成员变量,或本地类型的本地静态变量可以用__declspec(process)修饰。
在使用/clr:pure进行编译时,被声明为__declspec(process)的变量同时也应该声明为const类型。
如果想每个应用程序域拥有一份全局变量的拷贝时,请使用appdomain。
property:格式:__declspec( property( get=get_func_name ) ) declarator__declspec( property( put=put_func_name ) ) declarator__declspec( property( get=get_func_name, put=put_func_name ) ) declarator该属性可用于类或结构定义中的非静态“虚数据成员”。