`
haoningabc
  • 浏览: 1465811 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

c调用c++

阅读更多
参考
http://www.cppblog.com/franksunny/archive/2007/11/29/37510.html
http://tzc.is-programmer.com/posts/551.html

前阵子被问及一个在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的原文链接地址是
http://www.research.att.com/~bs/bs_faq2.html#callCpp
分享到:
评论

相关推荐

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

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

    c语言与c++互相调用示例

    首先,我们来看C语言调用C++函数的情况。由于C++是C的超集,大部分C代码可以在C++环境中编译运行,因此C调用C++的函数相对直接。但是,C++引入了名字修饰(Name Mangling)机制,这使得C++的函数在链接时的名称可能...

    c调用C++函数

    在编程世界里,C语言和C++是两种广泛使用的编程语言,它们各有特色,但有时候我们需要在C语言的代码中调用C++编写的函数,特别是在大型项目中,可能既有历史遗留的C代码,又有使用C++新开发的部分。本文将深入探讨...

    C调用C++库函数,简单实用

    "C调用C++库"是一个常见需求,这通常涉及到C++的封装和接口设计,使得C代码能够安全、高效地调用C++的功能。下面将详细探讨这一主题。 首先,C++库为了被C语言调用,必须遵循C语言的 ABI(应用程序二进制接口)规则...

    c语言调用C++类.zip xcode编译器

    标题"“c语言调用C++类.zip xcode编译器”"暗示了这个压缩包包含了一个示例,演示如何在Xcode中使用C语言调用C++类。下面将详细解释这一过程: 首先,为了在C语言中调用C++类,我们需要遵循以下步骤: 1. **C++类...

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

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

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

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

    c调用c++的Demo

    本示例将讲解如何在C语言(c language)中调用C++编写的函数,通过一个名为"main.c"的C源文件调用"hello.cpp"中的C++代码。这个过程在Ubuntu 18.04操作系统上进行,并使用CMake作为构建工具。 首先,我们来理解C与...

    Object C调用c++例子

    以下是一个关于"Objective-C调用C++"的知识点详解。 1. **Objective-C与C++的兼容性**: Objective-C是C语言的超集,因此它完全兼容C语言,并且可以方便地集成C++代码。这意味着Objective-C可以直接包含C++的类和...

    C#与C调用C++Dll,非托管,含struct调用及enum公用,完整项目,可直接编译或运行

    C#与C调用C++,非托管,含struct调用及enum公用,完整项目,可直接编译或运行。 项目将所有工程的输出统一到Debug。 vs2015+Framework4.6,注意工程的配置。 所有东西自写,只是出于样例参考的作用,所以代码规范...

    如何用c语言调用c++做成的动态链接库.docx

    如何用c语言调用c++做成的动态链接库.docx

    c调用C++实现

    还在为在开发C代码是不能很好的重构与继承而烦恼吗?该例子实现C 语言调用C++

    C调用C++的程序

    有时,我们可能需要在一个C编写的项目中使用C++库或者在C++项目中调用C函数,这就是所谓的“C调用C++”或“C++调用C”。下面将详细解释这个主题,以及如何实现这种跨语言的互操作性。 **1. C++的extern "C"声明** ...

    c调用c++函数.pdf

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

    Ubuntu Linux 下C调用C++类,使用Cmake编译 下载即可编译,gcc g++

    本项目提供了一个示例,演示如何在C程序中调用C++类,同时利用CMake进行编译管理。下面我们将详细探讨这个过程中的关键知识点。 首先,我们要理解C和C++之间的兼容性问题。C++是C的超集,大部分C代码可以直接在C++...

    C调用C++dll测试

    本案例中,我们探讨的是"C调用C++dll测试",这是一个关于在C语言程序中如何利用C++编写的动态链接库(DLL)的技术。C++ DLLs提供了一种方式来封装代码并使其在多个应用程序中复用,而C语言作为广泛使用的编程语言,...

    c调用c++函数.docx

    通过在C++中使用`extern "C"`关键字,我们可以避免名称修饰带来的兼容性困扰,使得C语言可以正确识别和调用C++函数。 总结来说,C调用C++函数的关键在于创建DLL,正确导入和导出函数,以及处理好名称修饰问题。而在...

    c#调用c++ dll 传参 string 崩溃的一种解决办法

    ### c#调用c++ dll 传参 string 崩溃的一种解决办法 在跨语言编程环境中,我们经常需要在不同编程语言之间进行交互。一个常见的场景是C#调用C++编写的动态链接库(DLL)。然而,在这种情况下可能会遇到一些问题,...

    PB调用C++DLL

    描述中提到的"调用C++的char*参数",意味着在DLL中可能有一个函数接受C风格的字符串(以NULL结尾的字符数组)。在PB中调用这样的函数时,你需要创建一个PB的字符串变量,然后将其转换为C风格的字符串,再传递给DLL。...

Global site tag (gtag.js) - Google Analytics