启动函数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++"。