`

C中如何调用C++函数?

 
阅读更多

前阵子被问及一个在C中如何调用C++函数的问题,当时简单回答是将函数extern "C"声明,当被问及如何将类内成员函数声明时,一时语塞,后来网上查了下,网上有一翻译C++之父的文章可以作为解答,遂拿来Mark一下。

 

 C++ 函数声明为``extern "C"''(在你的 C++ 代码里做这个声明),然后调用它(在你的 C 或者 C++ 代码里调用)。例如:

// C++ code:

extern "C" void f(int);

void f(int i)

{

     // ...

}

 

然后,你可以这样使用 f()

/* C code: */

void f(int);

void cc(int i)

{

    f(i);

   /* ... */

    }

 

当然,这招只适用于非成员函数。如果你想要在 C 里调用成员函数(包括虚函数),则需要提供一个简单的包装(wrapper)。例如:

// C++ code:

class C

{

       // ...

       virtual double f(int);

};

 

extern "C" double call_C_f(C* p, int i) // wrapper function

{

       return p->f(i);

}

 

然后,你就可以这样调用 C::f()

/* C code: */

double call_C_f(struct C* p, int i);

 

void ccc(struct C* p, int i)

{

       double d = call_C_f(p,i);

       /* ... */

}

 

如果你想在 C 里调用重载函数,则必须提供不同名字的包装,这样才能被 C 代码调用。例如

// C++ code:

void f(int);

void f(double);

 

extern "C" void f_i(int i) { f(i); }

extern "C" void f_d(double d) { f(d); }

 

然后,你可以这样使用每个重载的 f()

/* C code: */

void f_i(int);

void f_d(double);

 

void cccc(int i,double d)

{

       f_i(i);

       f_d(d);

       /* ... */

}

注意,这些技巧也适用于在 C 里调用 C++ 类库,即使你不能(或者不想)修改 C++ 头文件。

 该翻译的文档Bjarne Stroustrup的原文链接地址是

分享到:
评论

相关推荐

    c调用C++函数

    由于C++支持名称空间和类,而C语言没有这些概念,因此直接在C代码中调用C++函数会遇到兼容性问题。 为了使C代码能够调用C++函数,我们需要遵循以下步骤: 1. **extern "C" 声明**:C++允许使用`extern "C"`来告诉...

    lua调用C++函数

    Lua是一种轻量级的脚本语言,常用于游戏开发、嵌入式系统和服务器应用程序,因其简洁、高效而受到欢迎。...如果你遇到问题,可以尝试分析源码或者在类似的环境中编译运行,以便更好地理解和学习Lua调用C++函数的过程。

    Lua调用C++函数实现

    这主要通过 Lua 的 C API 实现,它提供了一套 C 函数供外部语言(如 C++)调用,同时也允许外部代码注册函数给 Lua 使用。在 C++ 中,我们可以创建一个 Lua 共享库,其中包含用于与 Lua 交互的函数。 1. **创建 Lua...

    C调用REFPROP,c调用c++函数,C,C++

    标签中的"调用REFPROP C++"再次强调了C++调用REFPROP库的主题,"C调用REFPROP"则意味着同样提供了C语言的调用方式。这通常涉及到使用C语言的函数指针或者C++的extern "C"语法,以确保C++编译器不会对函数进行名字...

    python调用C++函数

    本文将详细介绍如何在Python中调用C++函数,以实现Python与C++的交互。 首先,我们需要理解Python与C++之间的接口是如何建立的。Python提供了一种称为`ctypes`的库,它允许我们直接调用动态链接库(DLL或SO)中的C...

    C语言调用C++类中的方法

    总之,C语言调用C++类的方法涉及到C++的extern "C"声明、函数指针的使用以及正确的编译和链接步骤。理解这些细节对于进行跨语言编程至关重要。通过实践和调试,你可以更熟练地掌握这一技巧,从而在实际项目中灵活...

    C++调用C函数实例详解

    调用C语言的函数,需要在函数声明的地方语句extern “C”。如果不使用该语句,在链接的时候,编译器就会报以下这种错误。 Test.obj : error LNK2019: 无法解析的外部符号 “void __cdecl DeleteStack(struct _Node *...

    C#调用c++函数的dll文件,同时实现c++调用c#函数

    本示例展示了如何在C#和C++之间实现互操作性,即C#调用C++编写的动态链接库(DLL)函数,同时C++也能调用C#的方法。这主要依赖于.NET框架提供的互操作特性,如C++/CLI(C++的.NET版本)和P/Invoke(Platform Invoke...

    在c文件中如何调用c++文件中的函数的方法

    讲叙在嵌入式系统中,在c文件中如何调用c++文件中的函数的方法,并且还着重讲叙了c++文件中编写可以被c文件中调用函数的规则及方法。

    C# 调用C++DLL(函数参数包含指针)

    有时我们需要在C#应用中调用C++DLL来利用这些功能。本篇文章将深入探讨如何在C#中调用一个C++DLL,特别是当DLL函数参数中包含指针时的处理方法。 首先,理解C#与C++之间的互操作性是关键。.NET框架提供了一个名为P/...

    C调用REFPROP,c调用c++函数,C,C++源码.zip

    4. 另外,可能还包含了C语言调用C++函数的示例,比如定义一个C++类,然后在C代码中创建该类的实例并调用其方法。 学习和理解这些源码,有助于提升对跨语言调用的理解,以及如何利用REFPROP库进行流体性质计算的能力...

    MATLAB调用C_C++函数的方法

    在编写 C/C++ 函数时,需要注意函数名可以随意取,但保存的文件名将是将来在 MATLAB 中调用的函数名。例如,我们可以编写一个名为 ResizeArray 的函数,该函数的目的是截取数组的部分元素组成新的数组。这个函数需要...

    c调用c++函数.pdf

    标题中的"C调用C++函数"是指在C语言的程序中使用C++编写的函数或类的方法。在C++中,由于有名字修饰(Name Mangling),C语言无法直接识别C++的函数,因此需要一些特殊的处理来实现跨语言调用。本教程以VS2013作为...

    Matlab .m文件中调用C/C++函数

    在Matlab环境中,为了利用C或C++的强大性能和高效计算能力,我们有时需要在Matlab的.m文件中调用C或C++编写的函数。这种混合编程方式可以帮助我们实现一些Matlab自身不支持或者效率较低的操作。下面将详细介绍如何在...

    C中如何调用C++函数.pdf

    在C语言中调用C++函数是一...总的来说,要让C语言调用C++函数,关键在于使用`extern "C"`来声明函数,创建包装函数来处理C++特有的特性,如类成员函数和重载函数。通过这种方式,C和C++代码可以有效地协作并相互调用。

    wpf调用c++dll

    `CallingConvention.Cdecl`表示使用C语言的调用约定,与我们的C++函数匹配。 现在,你可以在WPF应用的任何地方调用这个C++函数了。例如,在按钮的点击事件处理程序中: ```csharp private void Button_Click...

    C_C++函数符号生成规则(函数名的修饰);C++ 函数重载.pdf

    C_C++函数符号生成规则(函数名的修饰);C++ 函数重载.pdf 本文主要介绍了C和C++函数符号生成规则,以及C++函数重载机制。 一、C函数符号生成规则 在C语言中,函数符号生成规则主要有三种:cdecl调用约定、std ...

    C中如何调用C++函数?

    前阵子被问及一个在C中如何调用C++函数的问题,当时简单回答是将函数用extern "C"声明,当被问及如何将类内成员函数声明时,一时语塞,后来网上查了下,网上有一翻译C++之父的文章可以作为解答,遂拿来Mark一下。...

Global site tag (gtag.js) - Google Analytics