discuz x2如何用模板语法调用数据库中某个字段的值?
2.对于C++类的成员函数,需要再做一个cpp文件来包装要调用的函数。
以上两项的例子,请参考C中如何调用C++代码的文章。
在C++中实现代码调用C,具体操作如下:
对于C中的函数代码,要么修改C代码的头文件,将其包含在C++代码中时在声明中添加Extern“C”,要么在C++代码中重新声明C函数,重新声明时添加Extern“C”头。
从上面的解释中,我明白了添加extern“C”头必须添加到C++代码文件中才能起作用。
我们来分析一下这种现象的本质原因:
c编译器编译没有函数类型信息的函数,只有函数符号名。比如C编译器把函数int a(float x)编译成_a这样的符号,C connector只要找到调用该函数的符号就能连接成功。它假设参数类型信息是正确的,这是C编译器连接器的缺点。为了实现函数重载,C++编译器在编译时会带函数的类型信息。例如,他可以将上面的A函数编译成一个符号,比如_a_float。为了实现重载,注意它还是不带返回值信息的,这也是C++不支持用函数的返回值来区分函数重载的原因之一。当然,函数用户对函数返回值的处理方式(比如忽略)也是一个重要原因。
基于以上,当C调用C++时,需要将对C++类的调用封装成C函数用于C调用,所以extern“C”的作用就是让编译器知道这一点,然后用C语言编译连接封装的函数(通常封装的函数是由C+编译器用C++编译的,使用extern“C”后,编译器用C方式编译封装的接口,当然,对于c语言的部分——调用者,还是按照c语言编译;分别编译好C++接口部分和C部分后,再连接起来就可以调用C++了。相反,当C++调用一个C函数时,extern“C”的作用是让C++连接器以C的方式找到调用函数的符号,即使用_a而不是_a_float来找到调用函数。