discuz x2如何用模板语法调用数据库中某个字段的值?

1.对于C++中的非类成员函数,只需在函数声明前加上Extern“C”即可,通常位于头文件中。当然,你也可以在cpp中把声明和函数定义放在一起。如果没有声明,可以直接在定义前加上Extern“c”。

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来找到调用函数。