happem

什么是函数链接规范

在使用不同编程语言进行软件联合开发的时候,需要统一函数、变量、数据类型、常量等链接规范,特别是在不同模块之间共享的接口部分,当开发程序库的时候,明确链接规范也是必须遵循的一条规则。

 

对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 

posted on 2012-09-26 10:32 happem 阅读(1028) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理