17一起做网站包包,沈阳个人网站建设代理品牌,注册企业邮箱收费吗,社交网站建设码目的
extern C是经常用到的东西#xff0c;面试题目也经常出现#xff0c;然则#xff0c;实际用时#xff0c;还是经常遗忘#xff0c;因此#xff0c;深入的了解一下#xff0c;以增强记忆。 extern C指令非常有用#xff0c;因为C和C的近亲…目的
extern C是经常用到的东西面试题目也经常出现然则实际用时还是经常遗忘因此深入的了解一下以增强记忆。 extern C指令非常有用因为C和C的近亲关系。
作用
注意extern C指令中的C表示的一种编译和连接规约而不是一种语言。C表示符合C语言的编译和连接规约的任何语言如Fortran、assembler等。 另外extern C指令仅指定编译和连接规约但不影响语义。例如在函数声明中指定了extern “C”仍然要遵守C的类型检测、参数转换规则。 综上所述extern C的真实目的是实现类C和C的混合编程。在C源文件中的语句前面加上extern “C”表明它按照类C的编译和连接规约来编译和连接 而不是C的编译的连接规约。这样在类C的代码中就可以调用C的函数或变量等。
生成符号的不同
在C和C中生成函数符号的方式有所不同。 在C语言中函数的符号是通过函数名和参数类型来生成的。如果两个函数的名字相同并且参数类型也相同那么它们的符号就是一样的。 在C中函数符号的生成则更加复杂主要是因为C支持函数重载也就是说两个函数可以有相同的名字 只要它们的参数类型或者参数数量不同。为了区分这些同名函数 C编译器会将函数的返回类型函数名参数类型参数数量参数顺序等因素考虑进去生成一个独一无二的符号。
情况
上面理论讲的很清楚下面用例子试试
先弄一个C的函数例子
cppFunc.h
#pragma once
#include stdio.h
void cppFunc(int num);
cppFunc.cpp
#include cppFunc.h
void cppFunc(int num)
{printf(enter function cFunc num%d\n, num);printf(exit function cFunc\n);
}主函数
#include iostream
#include cppFunc.h
int main()
{cppFunc(10);std::cout Hello World!\n;
}运行情况
符号是这样的
c调用C函数的例子 cFunc.h
#pragma once
#include stdio.h
void cFunc(int num);cFunc.c
#include cFunc.h
void cFunc(int num)
{printf(enter function cFunc num%d\n, num);printf(exit function cFunc\n);
}主函数
#include iostream
#include cFunc.h
//#include cppFunc.h
int main()
{cFunc(8);//cppFunc(10);std::cout Hello World!\n;
}运行情况
上面表明C按照C的函数名规则去链接函数符号为?cFuncYAXHZ 实际在OBJ中找不到。
从上图可知c语言的名字就是 cFunc所以找不到。 怎么找到呢? 主函数修改如下
#include iostream
extern C
{
#include cFunc.h
}
//#include cppFunc.h
int main()
{cFunc(8);//cppFunc(10);std::cout Hello World!\n;
}运行情况
这样就找到了这样就按照C的规则去找相应的函数。
总结
extern “C”{},解决了C与C编译结果的混用如下图所示