C++中怎么调用函数?

C++中怎么调用函数?,第1张

必须先创建一个bookmanger副本,然后用

bookmanger bm;

bmadd()

或者

bookmanger bm = new bookmanger();

bookmanger->add()调用。

注:这个要看类的名称的,调用时就像结构体一样,先用类引申一个对象就像Pid pid ; 调用时用对象名称,函数名就行了。

扩展资料:

如果想调用重载的C++函数,则须封装单独的接口共C调用。

// C++ Code

void foo( int x );

void foo( float x );

extern "C" void foo_i( int x )

foo( x );

extern "C" void foo_f( float x )

foo( x );

则C中可这样调用

// C Code

void foo_i( int x );

void foo_f( float x );

void ccc( int x1, float x2 )

foo_i( x1 );

foo_f( x2 );

//

肯定不行,main函数只能有一个的

要想跨文件调用,可以用#include

“file1c”

但是里面的函数不能出现main

,定义别的名字

就可以调用了

这个问题很有意思,我之前还没碰到过呢,我帮你在全球最大的编程论坛stackoverflow上搜了一个答案:

这个答案大意是说,C语言没有this指针,所以要自己写一个wrap API来封装C++的对象。

这个论坛高手云集,包括很多业界大拿,所以这个答案还是很可信的。下面的apih 就是你要写的wrap API

C has no thiscall notion The C calling convention doesn't allow directly calling C++ object member functions

Therefor, you need to supply a wrapper API around your C++ object, one that takes the this pointer explicitly, instead of implicitly

Example:

// Chpp

// uses C++ calling convention

class C {

public:

bool foo( int arg );

};

C wrapper API:

// apih

// uses C calling convention

#ifdef __cplusplus

extern "C" {

#endif

void C_Create();

void C_Destroy( void thisC );

bool C_foo( void thisC, int arg );

#ifdef __cplusplus

}

#endif

Your API would be implemented in C++:

#include "apih"

#include "Chpp"

void C_Create() { return new C(); }

void C_Destroy( void thisC ) {

delete static_cast<C>(thisC);

}

bool C_foo( void thisC, int arg ) {

return static_cast<C>(thisC)->foo( arg );

}

Objective-c方法调用流程

  Objective-c是一门动态语言,动态两个字主要就体现在我们调用方法的时候,运行时回动态的查找方法,然后调用相应的函数地址。运行时是整个Objective-c程序的基石,有了它我们的程序才能正常运行起来。

  NSObject是Cocoa中绝大部分类的基类,它主要是提供了序列话,拷贝对象,以及支持运行时动态识别的框架。

  在Objective-c中每一个类对象最开始的位置都会有一个isa指针,该指针指向一块内存区域,该部分主要包含两部分信息:

  1、指向父类的指针。

  2、自身的方法分发表。

  有了这两部分,Objective-c的方法的调用流程就可以跑起来了。当我们调用一个对象的某一个方法的时候,首先会在当前类的分发表中寻找该方法,如果找不到对应的方法,然后再去其父类中寻找该方法,依次类推直到找到对应的方法为止,流程图如下:

  你可能会想到,如果一个类有很深的继承层次,每次去调用根类的某个函数,岂不是都要做很多次查找。理论上是这个样子的,不过runtime也并非那么傻,它会为每一个类(不是对象)维护一个经常调用的方法的列表,只要调用过就会缓存起来(官方没有明确说明缓存机制),这样当程序运行稳定以后整个方法调用的过程就会更加高效。

  通过学习官方文档Objective-C Runtime Programming Guide,可以发现其实所有的selector调用最后都会转化为C类型的函数调用。举个例子我们创建了一个A类型的对象aSample,然后调用其test方法([aSample test]),编译的时候,编译器就会将该调用转化为objc_send(aSample, selector)的形式,runtime会调用test方法实现所对应的函数地址。该函数的参数包含了两个隐含的参数self以及_cmd,其中self指向调用该方法的对象,_cmd则代表要调用的方法。

  前面提到了NSObject提供了很多遍历的方法可以和运行时进行交互,其中有个方法methodForSelector,通过它我们可以直接获取到指定的方法对应的函数指针。通常我们直接使用Objective-c方式的方法调用就可以了,但有时程序中可能会频繁的调用某一个方法,为了提高效率。我们可以直接获取到方法对应的函数地址,然后直接调用该函数,这样就少了动态识别的时间。

首先,要在C++的函数前面加extern "C",这样的函数才能被其他语言调用。当然还得要求形参类型和返回类型都是C语言支持的类型。

其次,在把两种语言的o文件链接在一起的时候,gcc要加选项-lstdc++。

祝你成功!

有类没关系,只要你这个要引出的函数不是类里面的函数,就可以供C语言程序调用。

当程序编译后link,讲函数地址保存在段寄存器中,代码段内,当某处调用此函数时(汇编代码CALL),将此地址压入栈中,并且根据指令地址寄存器(程序计数器内)中保存的值计算到该函数地址的偏移量,随后通过__cdecl等调用方式将参数和局部变量压入栈中。具体的过程比较复杂,具体应该参照PE结构等。比较深入,我也只是粗略了解

可以参考计算机组成与设计一书

假设你想在类a里调用类b的函数int

f(x),两种办法:

1、class

a::b

也就是说将b定义为a的父类,

这样你就可以自然的在a里面用f(x)了

2、class

a

{

b

b_ins;

int

g(x);

}

int

g(x)

{

return

b_insf(x)

}

也就是说你可以在a里面使用一个b的对象作为成员变量,这样就可以用他的函数了

没有对象的时候要访问类成员函数的话,只能访问静态成员函数。例如:

class A

{

static void ABC()

{

}

}

这样可以在主函数里直接用

A::ABC();

这样的语句进行调用。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/12171027.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-21
下一篇2023-05-21

发表评论

登录后才能评论

评论列表(0条)

    保存