连接规范

来源:互联网 发布:淘宝权重0是什么意思 编辑:程序博客网 时间:2024/04/29 20:51

启动函数main()

main函数时系统内部默认调用的,即应用程序的启动函数在末尾调用了main名称,然后以它们的返回值为参数调用库函数exit函数,因此也就默认了main应该作为它的连接对象。如此看来main其实就是一个回调函数。

main函数限制:

1、不能重载

2、不能内联

3、不能定义为静态的

4、不能去其地址

5、不能由用户自己调用

。。。。。。

内部名称

在C语言中,所有函数不是局部于编译单元的static函数,就是具有extern连接类型和gobal作用域的全局函数,因此除了两个分别位于不同编译单元中的static函数可以同名外,全局函数不能同名,全局变量也是一样。其原因是c语言采用了一种极其简单的函数名称区分规则:仅在所有函数名前面添加前缀“_”。

但是c++不一样,c++中有重载,结构体,类等,所以它是利用重命名为“Name-Mangling”(名字修饰或名字改编)。即加作用域名称及重载函数的经过编码的参数信息。

 

————————————————————————————————————————————————————————————————————————

连接规范

在使用不同编程语言进行软件联合规范。因为采用不同的连接规范,那么连接的时候会造成不一致的内部名称,这肯定是错误的。

通用连接规范则属C连接规范:extern “C”使用如下:

1、对仅是一个类型,函数,变量或常量指定连接规范。

extern “C” void WinMain();

extern “C” const CLSID CLSID_DataConverter;

.....

2、如果是对一段代码限定连接规范。

#ifdef  _cplusplus

extern "C"{

#endif

const int Max_AGX = 200;

#pragram pack(push,4)//4字节对齐

typedef struct_Person

{

char *m_Name;

int m_Age;

 

}Person,*PersonPtr;

#pragram pack(pop);

Person g_Me;

int _cdecl memcmp (const void *,const void *,size_t);

#ifdef _cplusplus

}

#endif

3、如果当前使用的是C++编译器,并且使用了extern “C”来限定一段代码的连接规范,但是又想令其中某行或某段代码保持C++连接规范,则可以编写extern "C++"。