重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

c语言调用c类成员函数 c++类的成员函数

C语言函数调用的三种方式并分别举一例。

C++函数调用有三种常见方式:thiscall,__cdecl,__stdcall

专注于为中小企业提供网站设计制作、成都做网站服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业绥化免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了上1000+企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

今天看了篇介绍的文章,才比较清楚了点。thiscall,用于类的成员函数调用,

__thiscall对每个函数都增加了一个类指针参数

class aa

{

void bb(int cc);

};

实际上bb的函数原形是void bb(aa this, int cc);

以前知道类的成员函数在调用时会传入一个this指针,而不晓得thiscall就是专门指定了这种调用方式。__cdecl调用方式即为C,C++默认的调用方式。

void Input( int m,int n);/*相当于void __cdecl Input(int m,int n);*/

其特点是:1,由主调用函数进行参数压栈并且恢复堆栈;2,在主调用函数中进行实参的压栈并且顺序是从右到左;3,由于主调用函数管理堆栈,所以可以实现变参函数。

__stdcall则是标准调用方式,实际上就是PASCAL,CALLBACK,WINAPI ,其特点是:_主调用函数中负责压栈,在被调用函数中负责弹出堆栈中的参数,并且负责恢复堆栈。因此不能实现变参函数,参数传递是从右到左。另外,命名修饰方法是在函数前加一个下划线(_),在函数名后有符号(@),在@后面紧跟参数列表中的参数所占字节数(10进制),如:void Input(int m,int n),被修饰成:_Input@8 。

C语言成员函数

首先这个是C++的代码,C是没有类的概念,也不会有成员函数的概念。

void在这里代表该成员函数没有返回值。

在C里面如何调用C++类成员函数的问题,

fun_c()函数所在的代码文件命名为xxx.c,fun_Cplusplus()函数所在的代码文件命名为yyy.cpp,你先把yyy.cpp和其他所有cpp文件一起编译链接一遍,没有error之后,再加入xxx.c一起编译链接。在fun_c()的头文件里面不需要包含fun_Cplusplus()的头文件,只需要在xxx.c开头声明一下fun_Cplusplus()是外部函数就可以了:

extern fun_Cplusplus();

c语言如何实现函数的调用

如何调用C语言写的库,如a.lib等,有对应的库头文件a.h。假设a.h中定义了函数:

int

WhyCoding(int

a,

float

b);

做法是,

/*

cpp_a.h

*/

extern

"C"

{

#include

"a.h"

}

/*

cpp_a.h

*/

extern

"C"

{

int

WhyCoding(int

a,

float

b);

/*

重定义所有的C函数

*/

}

从上面可以看出,extern

"C"

是用在C和C++之间的桥梁。之所以需要这个桥梁是因为C编译器编译函数时不带

函数的类型信息,只包含函数符号名字,如C编译器把函数int

a(float

x)编译成类似_a这样的符号,C连接器只要

找到了调用函数的符号,就可以连接成功,它假设参数类型信息是正确的,这是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

调用C++了).

相反,C++调用C函数,extern

"C"

的作用是:让C++连接器找调用函数的符号时采用C的方式,即使用_a而不是

_a_float来找调用函数。

C语言函数调用类的问题,急求解释

void CallMyFun(FunType fp,int x);是一个包含函数指针的函数!

fp只是函数指针的名称,是 CallMyFun函数的形参,这个名称你可以随便取的

当调用CallMyFun(MyFun1,10);//假设调用此变量时,

fp指代的就是MyFun1函数,而MyFun1的参数哪里来?就是通过CallMyFun的第2个参数传递进来的,这里是10

所以运行CallMyFun(MyFun1,10);函数,其实就是运行了call MyFun1(10)

所以运行CallMyFun(MyFun2,20);函数,其实就是运行了call MyFun2(20)

所以fp(x)指代的是一个函数,如果要输出他的结果,那在定义MyFun1,MyFun2时,函数就需要有返回值,而不能用void

C语言调用C++非静态成员函数

不管是不是静态的,都不能直接调用

而是要加一层C++的封装。

而且封装的函数,必须加extern "C"才可以。


名称栏目:c语言调用c类成员函数 c++类的成员函数
文章转载:http://cqcxhl.com/article/hhhdeh.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP