C++__declspec关键字详细用法
cppcheck扫描规则
obsoleteFunctionsasctime
过时的函数asctime调用。推荐使用strftime函数。
obsoleteFunctionsgets
过时的函数被调用。推荐使用fgets函数。
operatorEq
操作符不符合C++的标准
operatorEqToSelf
使用运算符“=”检查自己的作业时应该避免动态内存的问题。
不正确的字符串逻辑
incorrectStringCompare
不正确的字符串比较
insecureCmdLineArgs
长命令行参数可能使缓冲区溢出。
invalidPointerCast
不兼容的二进制表示
invalidPrintfArgType_int
无效的整形输出格式
invalidPrintfArgType_s
无效的字符串输出格式
invalidPrintfArgType_sint
无效的sint输出格式
invalidPrintfArgType_uint
无效的uint输出格式
invalidscanf
字段没有字符长度限制
IOWithoutPositioning
读和写操作没有调用Positioning函数
memleak
compareBoolExpressionWithInt
布尔表达式与整形比较
comparisonError
比较错误
comparisonOfBoolWithInt
布尔表达式与整形比较
comparisonOfFuncReturningBoolError
比较函数返回布尔值的错误
ConfigurationNotChecked
c语言异常值剔除程序
c语言异常值剔除程序在C语言中,异常值剔除是指从数据集中排除异常值或异常数据点的过程。
通常,异常值是指与数据集中大多数数据点明显不同的数据点,可能是由于测量误差、数据录入错误或者其他原因导致的。
在C语言中,可以通过编写程序来实现异常值的剔除。
以下是一个简单的示例程序,用于从数据集中剔除异常值:c.#include <stdio.h>。
#define MAX_SIZE 100。
int main() {。
int data[MAX_SIZE];int n, i, j;// 从用户输入中获取数据集的大小。
printf("Enter the number of elements: "); scanf("%d", &n);// 从用户输入中获取数据集。
printf("Enter the elements:\n");for (i = 0; i < n; i++) {。
scanf("%d", &data[i]);}。
// 计算数据集的平均值。
int sum = 0;for (i = 0; i < n; i++) {。
sum += data[i];}。
float mean = (float)sum / n;// 计算数据集的标准差。
float variance = 0;for (i = 0; i < n; i++) {。
variance += (data[i] mean) (data[i] mean); }。
float std_dev = sqrt(variance / n);// 定义一个阈值,例如标准差的3倍。
float threshold = 3 std_dev;// 剔除超出阈值的异常值。
for (i = 0; i < n; i++) {。
if (abs(data[i] mean) > threshold) {。
C语言Printf和Scan函数的使用方法
C语言Printf和Scan函数的使用方法一printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。
在编写程序时经常会用到此函数。
printf()函数的调用格式为:printf("<格式化字符串>", <参量表>);其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出; 另一部分是格式化规定字符, 以"%"开始, 后跟一个或几个规定字符,用来确定输出内容格式。
参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出参数个数一样多, 各参数之间用","分开, 且顺序一一对应, 否则将会出现意想不到的错误。
格式化字符串的格式是:%[标志][输出最小宽度][.精度][长度]格式字符1. 标志:标志字符为-、+、#、空格四种,其意义下表所示:标志意义- 结果左对齐,右边填空格+ 输出符号(正号或负号)空格输出值为正时冠以空格,为负时冠以负号# 对c,s,d,u类无影响;对o类,在输出时加前缀o;对x类,在输出时加前缀0x;对e,g,f 类当结果有小数时才给出小数点()例1:#include<stdio.h>main(){int a=100;float b=123.255;printf("a=%d ",a);printf("a=%10d ",a);printf("a=%-10d ",a);printf("a=%+d ",a);printf("a=% d ",a);printf("a=%#o ",a);printf("a=%#x ",a);printf("b=%#f ",b);}运行结果a=100a= 100a=100a=+100a= 100a=0144a=0x64b=123.254997 ()2.输出最小宽度:用十进制整数来表示输出的最少位数。
_declspec用法
__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))来精确控制用户自定义数据的对齐方式。
VCCString用法整理
VC:CString用法整理(转载)1.CString::IsEmptyBOOL IsEmpty( ) const;返回值:如果CString 对象的长度为0,则返回非零值;否则返回0。
说明:此成员函数用来测试一个CString 对象是否是空的。
示例:下面的例子说明了如何使用CString::IsEmpty。
// CString::IsEmpty 示例CString s;ASSERT( s.IsEmpty() );请参阅CString::GetLength2.CString::LeftCString Left( int nCount ) const;throw( CMemoryException );返回值:返回的字符串是前nCount个字符。
示例:CString s( _T("abcdef") );ASSERT( s.Left(2) == _T("ab") );3.CString::LoadStringBOOL LoadString( UINT nID );throw( CMemoryException );返回值:如果加载资源成功则返回非零值;否则返回0。
nID 一个Windows 字符串资源ID。
说明:此成员函数用来读取一个由nID 标识的Windows 字符串资源,并放入一个已有CString 对象中。
示例:下面的例子说明了如何使用CString::LoadString。
// CString::LoadString 示例#define IDS_FILENOTFOUND 1CString s;if (! s.LoadString( IDS_FILENOTFOUND ))4.CString::MakeLowervoid MakeLower( ); //改变字符的小写5.CString::MakeReversevoid MakeReverse( ); //字符倒置6.CString::MakeUppervoid MakeUpper( ); //改变字符的大写7.CString::Mid CString Mid( int nFirst ) const; CString Mid( int nFirst, int nCount ) const; nCount代表要提取的字符数, nFirst代表要提取的开始索引位置示例:CString s( _T("abcdef") ); ASSERT( s.Mid( 2, 3 ) == _T("cde") ); 8.CString::ReleaseBuffervoid ReleaseBuffer( int nNewLength = -1 );参数:nNewLength此字符串的以字符数表示的新长度,不计算结尾的空字符。
C语言字符串处理常用函数和操作
C语言字符串处理常用函数和操作C语言是一门广泛应用于系统程序开发和嵌入式系统编程的高级编程语言。
在C语言中,字符串是常见的数据类型,处理字符串是编程过程中不可避免的任务之一。
本文将介绍一些常用的C语言字符串处理函数和操作。
1. 字符串长度计算字符串的长度是指字符串中字符的个数。
在C语言中,使用strlen 函数可以计算字符串的长度。
其函数原型为:```size_t strlen(const char *str);```其中,str是指向以空字符 '\0' 结束的字符数组的指针,函数返回字符串的长度。
2. 字符串拷贝字符串的拷贝操作是将一个字符串的内容复制到另一个字符串中的操作。
C语言提供了strcpy函数用于字符串拷贝。
其函数原型为:```char *strcpy(char *dest, const char *src);```其中,dest是目标字符串的指针,src是源字符串的指针。
函数将源字符串复制到目标字符串,并返回目标字符串的指针。
3. 字符串连接字符串连接操作将两个字符串连接成一个新的字符串。
C语言提供了strcat函数用于字符串连接。
其函数原型为:```char *strcat(char *dest, const char *src);```其中,dest是目标字符串的指针,src是源字符串的指针。
函数将源字符串连接到目标字符串的末尾,并返回目标字符串的指针。
4. 字符串比较字符串比较操作用于判断两个字符串是否相同。
C语言提供了strcmp函数用于字符串比较。
其函数原型为:```int strcmp(const char *str1, const char *str2);```其中,str1和str2是两个待比较的字符串指针。
函数返回一个整数值,若str1小于str2,则返回负数;若str1等于str2,则返回零;若str1大于str2,则返回正数。
5. 字符串查找字符串查找操作用于在一个字符串中查找指定的子串。
C TEST介绍及使用说明
华唐信息 (2)在[-10,10]内随机生成 5 个值(可能是-8, 1, 3, 4, 10) :
3.3
自动测试设置[测试用例生成- Test Case Generation]
控制动态分析测试的测试用例生成:
Max. Count of Generated Test Cases: 对一个被测函数可能生成的最大测试用例的数量。允 许任何大于 0 的整数。默认是 50 个,可以修改。 Max Depth of Field Inspection: 对分层或嵌套的类可能生成的测试用例的最大深度。允许任 何大于 0 的整数。有时不很容易确定合适的域检查的最大深度。我们建议你观察一下测试 结果浏览窗,在你的初始测试中包括多少层次的检查,如果你需要更多的检查层次,增加 该值。 Timeout (in seconds) for Test Case Execution: 一个测试用例执行的最长时间(秒数) ,超过 这个时间,C++Test 将给出一个信息并终止当前测试用例的执行,转到下一个测试用例执 行。允许任何大于 0 的整数。 Max. Dynamic Allocation Size: 对于一个给定的变量,当动态分配内存(该变量类型)时, 分配的元素的最大数量。该参数避免分配过量的内存,而你在当前测试时并不需要,例如 数组。允许任何大于 0 的整数。 Object Initialization Mode: 你可以自由选择地初始化对象,有三种方法: 1) Use Constructors ―――使用构造函数, 2) Using Member Wise ―――在成员函数中直接初始化, 3) Use Object Repository ―――使用对象库中保存的自定义对象。 可以组合使用这些方法。 注意只使用构造函数时,产生的测试用例可能比预期的要少。 Dynamic Analysis Mode for Symbols without Test Cases: Auto-Generate Test Cases: 控制是否要 自动生成测试用例。
c关键字精选大全
C++关键字大全1.asm(汇编),用法如下:asm(指令字符串);允许在C++程序中嵌入汇编代码。
2.auto(自动,automatic)是存储类型标识符,表明变量“自动”具有本地范围,块范围的变量声明(如for循环体内的变量声明)默认为auto存储类型。
3.bool(布尔)类型,C++中的基本数据结构,其值可选为true(真)或者false(假)。
C++中的bool类型可以和int混用,具体来说就是0代表false,非0代表true。
bool类型常用于条件判断和函数返回值。
4.break(中断、跳出),用在switch语句或者循环语句中。
程序遇到break后,即跳过该程序段,继续后面的语句执行。
5.case用于switch语句中,用于判断不同的条件类型。
6.catch catch和try语句一起用于异常处理。
7.char char(字符,character)类型,C++中的基本数据结构,其值一般为0~255的int。
这256个字符对应着256个ASCII码。
char类型的数据需要用单引号’’括起来。
8.class class(类)是C++面向对象设计的基础。
使用class关键字声明一个类。
9.const const(常量的,constant)所修饰的对象或变量不能被改变,修饰函数时,该函数不能改变在该函数外面声明的变量也不能调用任何非const函数。
在函数的声明与定义时都要加上const,放在函数参数列表的最后一个括号后。
在C++中,用const声明一个变量,意味着该变量就是一个带类型的常量,可以代替#define,且比#define多一个类型信息,且它执行内链接,可放在头文件中声明;但在C中,其声明则必须放在源文件(即.C文件)中,在C中const声明一个变量,除了不能改变其值外,它仍是一具变量10.const_cast用法:const_cast<type_id>(expression)该运算符用来修改类型的const或volatile属性。
C语言中const,volatile,restrict的用法总结
C语⾔中const,volatile,restrict的⽤法总结变量声明中带有关键词const,,这是显⽽易见的⼀点。
指针使⽤const则要稍微复杂点,因为不得不把让指针本⾝成为const 和指针指向的值成为const区别开来、下⾯的声明表⽰pf指向的值必须是不变的constfloat *pf;⽽pf则是可变的,它可以指向另外⼀个const或⾮const值;相反,下⾯的声明说明pf是不能改变的,⽽pf所指向的值则是可以改变的:float* const pf;最后,当然可以有既不能改变指针的值也不能改变指针指向的值的值的声明⽅式:constfloat * const pf;需要注意的是,还有第三种放置const关键字的⽅法:float const * pf; //等价于constfloat * pf;总结就是:⼀个位于*左边任意位置的const使得数据成为常量,⽽⼀个位于*右边的const使得指针本⾝成为const还要注意的⼀点是关于const在全局数据中的使⽤:使⽤全局变量被认为是⼀个冒险的⽅法,它使得数据在程序的任何部分都可以被错误地修改,如果数据是const,那么这种担⼼就是多余的了不是嘛?因此对全局数据使⽤const是合理的。
然⽽,在⽂件之间共享const数据要格外⼩⼼,有两个策略可以使⽤。
⼀个是遵循外部变量的惯⽤规则,在⼀个⽂件进⾏定义声明,在其他⽂件进⾏引⽤声明(使⽤关键字extern)。
/*file1.c------定义⼀些全局常量*/const double PI = 3.14159;/*file2.c-----是⽤在其他⽂件中定义的全局变量*/extern const dounle PI;另外⼀个⽅法是把全局变量放在⼀个include⽂件⾥,这时候需要格外注意的是必须使⽤静态外部存储类/*constant.h----定义⼀些全局常量*/static const double PI = 3.14159;/*file1.c-----使⽤其他⽂件定义的全局变量*/#include”constant.h”。
C#程序代码编译时常用的命令
C#程序代码编译时常用的命令时间:2009-05-31 20:02:54来源:网络作者:未知点击:0次CSC.exe把Visual C#程序代码编译成IL文件时,有着很多参数和开关选项。
正确的了解和运用这些参数和开关有时会解决一些看似很棘手的问题。
下面就通过一张表来大致说明一下这些参数和开关的具体作用。
这些参数和开关选CSC.exe把Visual C#程序代码编译成IL文件时,有着很多参数和开关选项。
正确的了解和运用这些参数和开关有时会解决一些看似很棘手的问题。
下面就通过一张表来大致说明一下这些参数和开关的具体作用。
这些参数和开关选项是按照字母顺序来排列的。
其中带"*",是一些常用的参数或开关。
选项用途@ * 指定响应文件。
/?, /help 在控制台的计算机屏幕上显示编译器的选项/addmodule 指定一个或多个模块为集会的一部分/baseaddress指定装入DLL的基础地址/bugreport 创建一个文件,该文件包含是报告错误更加容易的信息/checked 如果整数计算溢出数据类型的边界,则在运行时产生一个例外的事件/codepage 指定代码页以便在编译中使用的所有源代码文件/debug * 发送调试信息/define 定义预处理的程序符号/doc * 把处理的文档注释为XML文件/fullpaths 指定编译输出文件的反正路径/incremental 对源代码的文件进行增量编译/linkresource 把.NET资源链接到集合中/main 指定Main方法的位置/nologo 禁止使用编译器的标志信息/nooutput 编译文件但不输出文件/nostdlib 不导出标准库(即mscorlib.dll)/nowarn 编译但编译器并不显示警告功能/optimize 打开或者关闭优化/out * 指定输出文件/recurse 搜索编译源文件的子目录/reference * 从包含集合的文件中导入元数据/target * 指定输出文件的格式/unsafe 编译使用非安全关键字的代码/warn 设置警告级别/warnaserror 提升警告为错误/win32icon 插入一个.ico文件导输出文件中去/win32res 插入一个Win32资源导输出文件中具体说明:一.@这个选项是用来指定响应文件。
c++ shellexecuteex函数
c++ shellexecuteex函数全文共四篇示例,供读者参考第一篇示例:ShellExecuteEx函数是一种由微软提供的用于在C++程序中调用外部应用程序或打开文件的函数。
这个函数不仅可以打开可执行文件,还可以打开文档、网页、控制面板、文件夹等,是一个非常强大和灵活的函数。
在C++中使用ShellExecuteEx函数,首先要包含Windows.h头文件,并链接shell32.lib库。
需要注意的是,该函数只能在Windows 操作系统下有效。
ShellExecuteEx函数的原型如下:```cppBOOL ShellExecuteEx(SHELLEXECUTEINFO *pExecInfo);```SHELLEXECUTEINFO结构体的定义如下:```cpptypedef struct {DWORD cbSize; ULONG fMask; HWND hwnd; LPCTSTR lpVerb; LPCTSTR lpFile; LPCTSTR lpParameters; LPCTSTR lpDirectory; int nShow; HINSTANCE hInstApp; LPVOID lpIDList; LPCTSTR lpClass; HKEY hkeyClass; DWORD dwHotKey; HANDLE hIcon; HANDLE hProcess;} SHELLEXECUTEINFO;```下面是一个简单的例子,演示如何使用ShellExecuteEx函数来打开一个网页:```cpp#include <Windows.h>ShellExecuteEx(&sei);return 0;}```在这个例子中,我们首先定义了一个SHELLEXECUTEINFO结构体sei,并初始化了一些成员变量。
lpFile指定要打开的网页地址,nShow指定窗口显示方式。
最后调用ShellExecuteEx函数打开网页。
C#调用C++的程序
C# 调用C++ 程序2010-11-16 08:54:43| 分类:.NET技术| 标签:|字号大中小订阅一个简单的案例,学习一下如何通过C#来调用用C++开发的DLL中提供的API.1. 建立一个C#控制台工程,主要用于调试。
2. 在解决方案中添加一个新的空工程(VC++的)。
3. 创建后的工程如下图所示:4. 在C++工程中添加一个源文件到Source Files文件夹(xxx.c or xxx.cpp),如:MyMath.cpp内容如下:#include<string.h>extern"C"__declspec(dllexport) int mySum(int a, int b, int *c){*c = a + b;return *c;}5. 右键点击C++工程,在属性中的General->Configuration Type 选择Dynamic Library (.dll)。
6. 这里还要注意的是为了编译生成的dll文件能被c# 工程导入你需要Common Language Runtime support 选择Common Language Runtime Support (/clr)这项,否则编译的dll不能用到c#工程当中。
7.build C++工程(你也可以用命令行CL.exe来编译文件)。
之后,有很多人就直接想当然的跑到c++工程下面的Debug文件夹里去找xxx.dll文件,结果只看到xxx.dll.intermediate.manifest这样的文件失望而归。
其实编译后真正的dll文件是在解决方案的Debug文件夹下面。
在本例子里,是放在目录D:\C++Project\CImportDemo\Debug下,而不是目录D:\C++Project\CImportDemo\CDllProject\Debug下。
8.在c#工程的引用中导入xxx.dll。
c++中__declspec的用法详解
c++中__declspec的⽤法详解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")) 声明⼀个已经分配了数据段的⼀个数据项。
VC++编译参数大全
/c:只编译,不连接,相当于在"Build"菜单下选择了"Compile"
/D:定义常量和宏,与源程序里的#define 有相同效果
/E:预处理C、C++源文件,将源文件中所有的预编译指令及宏展开,将注释去掉,然后
将预处理器的输出拷贝至标准输出设备输出,并且在每个文件的开头和末尾加入#line
先定义这个类,但要首先指定这个类是使用何种继承方法
/vmm:设置指针的表示方法为Single Inheritance and Multiple Inheritance
/vms:设置指针的表示方法为Single Inheritance
/vmv:设置指针的表示方法为Any class
/W:设置警告等级
/I:指定头文件的搜索路径
/J:将char的缺省类型从signed char改成unsigned char
/LD:创建一个动态连接库
/LDd:创建一个Debug版本的动态链接库
/link:将指定的选项传给连接器
/MD:选择多线程、DLL版本的C Run-Time库
/MDd:选择多线程、DLL、Debug版本的C Run-Time库
/Gh:在每个函数的开头调用钩子(hook)函数--penter
/Gi:允许渐进编译
/Gm:允许最小化rebuild
/GR:允许运行时类型信息(Run-Time Type Infomation)
/Gr:指定使用__fastcall的函数调用规则
/Gs:控制堆栈检测所用内存大小
/GT:支持用__declspec(thread)分配的数据的fier-safety
cl.exe link.exe用法详解
cl.exe link.exe用法详解CL.exe是控制Microsoft C和C++编译器与链接器的32位工具。
编译器产生通用对象文件格式(COFF)对象(.obj)文件。
链接器产生可执行文件(.exe)或动态链接库文件(DLL)。
默认情况下cl.exe编译完后自动调用link.exe进行连接.所以通常cl a.cpp后会生成两个文件:a.obj和a.exe;注意,所有编译器选项都区分大小写。
注:运行cl a.cpp可能需要在c:\program files\microsoft visual studio\vc98\bin\vcvars32.bat注册环境变量.vc目录下的cl.exe编译程序环境变量的配置方法在“我的电脑--属性--高级--环境变量”中,添加如下变量:INCLUDEC:\Program Files\Microsoft Visual Studio\VC98\IncludeLIBC:\Program Files\Microsoft Visual Studio\VC98\LibPATHC:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin;C:\Program Files\Microsoft Visual Studio\VC98\BinC表示安装盘符,注意这里是两个路径,因为cl.exe要用到MSDev98\Bin目录下的MSPDB60.DLL。
如果已经存在这些变量,则把以上值分别加在对应的变量值的后面,注意在添加前用分号隔开。
用法如下:CL[option...]file...[option|file]...[lib...][@command-file][/link link-opt...]option:一个或多个CL选项。
请注意,所有选项都应用于所有指定的源文件。
选项是由一个正斜杠(/)或一个短划线(-)指定的。
如果某个选项带有参数,则该选项的说明指定在选项和参数之间是否允许有空格。
declspec(dllexport)与_declspec(dllimport)
declspec(dllexport)与_declspec(dllimport)(转)2010-12-21 10:46:05| 分类:默认分类 | 标签:导出 dllimport __declspec dllexport 函数 |字号大中小订阅一部分:使用 __declspec(dllexport) 从 DLL 导出Microsoft 在 Visual C++ 的 16 位编译器版本中引入了__export,使编译器得以自动生成导出名并将它们放到一个 .lib 文件中。
然后,此 .lib 文件就可以像静态 .lib 那样用于与 DLL 链接。
在 32 位编译器版本中,可以使用__declspec(dllexport)关键字从 DLL 导出数据、函数、类或类成员函数。
__declspec(dllexport)会将导出指令添加到对象文件中,因此您不需要使用 .def 文件。
当试图导出 C++ 修饰函数名时,这种便利最明显。
由于对名称修饰没有标准规范,因此导出函数的名称在不同的编译器版本中可能有所变化。
如果使用__declspec(dllexport),仅当解决任何命名约定更改时才必须重新编译 DLL 和依赖 .exe 文件。
许多导出指令(如序号、NONAME 和 PRIVATE)只能在 .def 文件中创建,并且必须使用 .def 文件来指定这些属性。
不过,在 .def 文件的基础上另外使用__declspec(dllexport)不会导致生成错误。
若要导出函数,__declspec(dllexport)关键字必须出现在调用约定关键字的左边(如果指定了关键字)。
例如:__declspec(dllexport) void __cdecl Function1(void);若要导出类中的所有公共数据成员和成员函数,关键字必须出现在类名的左边,如下所示:class __declspec(dllexport) CExampleExport : public CObject{ ... class definition ... };生成 DLL 时,通常创建一个包含正在导出的函数原型和/或类的头文件,并将__declspec(dllexport)添加到头文件中的声明中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
__declspec关键字详细用法2010-03-04 15:04__declspec用于指定所给定类型的实例的与Microsoft相关的存储方式。
其它的有关存储方式的修饰符如static与extern等是C 而__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是对齐参数,其有效值是2的整数次幂(从1到8192字节),如2,4,8,16,32或64。
参数declarator是要设置对1.使用__declspec(align(n))来精确控制用户自定义数据的对齐方式。
你可以在定义struct,union,class或声明变量时使用__dec2.不能为函数参数使用__declspec(align(n))。
3.如果未使用__declspec(align(#)),编译器将根据数据大小按自然边界对齐。
如4字节整数按4字节边界对齐;8字节double按构体中的数据,将取数据本身的自然对齐方式和#pragma pack(n)设置的对齐系数中的最小值进行对齐。
4.__declspec(align(n))和#pragma pack(n)是一对兄弟,前者规定了对齐系数的最小值,后者规定了对齐系数的最大值。
5.当两者同时出现时,前者拥有更高的优先级。
即,当两者同时出现且值矛盾时,后者将不起作用。
6.当变量size大于等于#pragma pack(n)指定的n,而且__declspec(align(n))指定的数值n比对应类型长度小的时候,这个__dec 作用。
7.当#pragma pack(n)指定的值n大于等于所有数据成员size的时候,这个值n将不起作用。
allocate:格式:__declspec(allocate("segname")) declarator为数据指定存储的数据段。
数据段名必须为以下列举中的一个:code_segconst_segdata_seginit_segsectionappdomain:指定托管程序中的每个应用程序域都要有一份指定全局变量或静态成员变量的拷贝。
deprecated:与#pragma deprecated()的作用相同。
用于指定函数的某个重载形式是不推荐的。
当在程序中调用了被deprecated修饰的函数时告,并且可以指定具体的警告信息。
该警告信息可以来源于定义的宏。
例如:// compile with: /W3#define MY_TEXT "function is deprecated"void func1(void) {}__declspec(deprecated) void func1(int) {}__declspec(deprecated("** this is a deprecated function **")) void func2(int) {}__declspec(deprecated(MY_TEXT)) void func3(int) {}int main() {func1();func1(1); // C4996,警告信息:warning C4996: 'func1': was declared deprecatedfunc2(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++规则进行名字处理,请使用.dejitintrinsic:格式:__declspec(jitintrinsic)用于标记一个函数或元素是64位通用语言运行时(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(restr 正确。
noinline:因为在类定义中定义的成员函数默认都是inline的,__declspec(naked)用于显式指定类中的某个函数不需要inline(内联)。
如果一能影响不大,有必要将其声明为非内敛的。
例如,用于处理错误情况的函数。
noreturn:一个函数被__declspec(noreturn)所修饰,那么它的含义是告诉编译器,这个函数不会返回,其结果是让编译器知道被修饰为__d 之后的代码不可到达。
如果编译器发现一个函数有无返回值的代码分支,编译器将会报C4715警告,或者C2202错误信息。
如果这个代码分支是因为函的话,可以使用约定__declspec(noreturn)来避免上述警告或者错误。
将一个期望返回的函数约定为__declspec(noreturn)将导致未定义的行为。
在下面的这个例子中,main函数没有从else分支返回,所以约定函数fatal为__declspec(noreturn)来避免编译或警告信息。
__declspec(noreturn) extern void fatal () {}int main() {if(1)return 1;else if(0)return 0;elsefatal();}nothrow:格式:return-type __declspec(nothrow) [call-convention] function-name ([argument-list])可用于函数声明。
告诉编译器被声明的函数以及函数内部调用的其它函数都不会抛出异常。
novtable:可用于任何类声明中,但最好只用于纯接口类,即类本身从不实例化。
此关键字的声明将阻止编译器对构造和析构函数的vfptr的码大小。
如果试图实例化一个用__declspec(novtable)声明的类然后访问类中成员,则会在运行时产生访问错误(access violation,即AV)。
process:表示你的托管应用程序进程应该拥有一份指定全局变量,静态成员变量,或所有应用程序域共享的静态本地变量的拷贝。
在使用/使用__declspec(process),因为使用/clr:pure进行编译时,在默认情况下,每个应用程序域拥有一份全局和静态变量的拷贝。
在使使用__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该属性可用于类或结构定义中的非静态“虚数据成员”。
实际上就是做了一个映射,把你的方法映射成属性,以供访问。