在使用不同编程语言进行软件联合开发的时候,需要统一函数、变量、数据类型、常量等链接规范,特别是在不同模块之间共享的接口部分,当开发程序库的时候,明确链接规范也是必须遵循的一条规则。
对COM接口及其使用的数据类型来说,是否采用统一的链接规范,对其二进制兼容性和可移植性都没有影响。因为连接规范主要影响到名字改编方案的不同,这样即使接口两端对接口本身的解释不通,只要它们使用一致的成员对齐方式和布局方案、一致的函数调用规范、一致virtual function实现方式,总是就是一致的C++对象模型。并且保证COM组件升级时不改变原来的接口和数据类型定义,则所有方法的运行时绑定都不会存在问题(所有方法的调试都被转换为通过对象指针对vptr和vtable及函数指针的操作,这种间接性不再需要任何方法名即函数名的参与,而接口名和方法名只是为了让客户端的代码能够顺利通过编译,但是连接时就完全不在需要了。)
但是对于定义于普通静态链接库和动态链接库中的全局数据类型、全局函数、全局变量甚至全局常量,它们的连接规范必须在两端保持一致、否则客户程序会出现连接问题。这是因为普通的封装为DLL的函数库或者类库,客户程序在创建使一般都需要与它们的导出库进行连接,除非使用loadlibrary()和getprocaddress()函数对来获得DLL中函数的地址,通用的连接规范要属C连接规范:extern‘C’。
具体使用方法,里仁教育嵌入式培训职业讲师详情讲解:
Extern’C’void WinMainCRTStartup();
Extern’C’const CLSID CLSID_DataConvert();
Extern’C’struct Student{.......};
Extern’C’student g_student;
如果是对一段代码指定连接规范:
#ifdef _cplusplus
Extern ‘C’{
#endif
Const int MAX_AGE=200;
#pragma pack(push,4)
Typedef struct _person
{
Char *m_Name;
Int m_Age;
}person,*personPtr;
#pragma pack(pop)
Person g_Me;
Int _cdecl memcmp(const void*,const void*,size_t);
Void * _cdecl memcpy(void,const void*,size_t);
Void* _cdecl memset(void*,int,size_t);
#ifdef _cplusplus
}
#endif
嵌入式行业资讯:全套基础:
http://www.lirenedu.org/index.php?ack=lanmu&id=82