手机版
你好,游客 登录 注册
背景:
阅读新闻

C 程序与 C++ 程序之间的相互调用

[日期:2019-02-23] 来源:Linux社区  作者:GyForever1004 [字体: ]

因为 C 编译器编译函数时不带参数的类型信息,只包含函数的符号名字。如 void foo( int x ) , C 编译器会将此函数编译成类似 _foo 的符号,C 链接器只要找到了调用函数的符号,就会认为链接成功。而 C++ 编译器为了实现函数重载,会在编译时带上函数的参数信息。如它可以把上面的函数编译成类似于 _foo_int 这样的符号。

所以在 C++ 与 C 相互调用时,要用 extern "C" 加以声明。

下面用两个示例实现它们之间的相互调用(没有优化代码,只是起示例作用)。

C++ 调用 C 函数
/* cfile.c */

#include <stdio.h>

void C_Func()
{
    puts("Hello, I'm C_Func"); 
}
/* cppfile.cpp */

#include <iostream>

extern "C" void C_Func(void);

int main()
{
    C_Func();

    system("pause");
    return 0;
}

C 调用 C++ 内类的成员函数
/* cppfile.cpp */

#include <iostream>
#include "cpphfile.h"

using namespace std;

void Myclass::print()
{
    cout << "Hello, I'm print function." << endl;
}
/* cpphfile.h */

#ifndef _CPPCLASS_H__
#define _CPPCLASS_H__

class Myclass{
public:
    void print();
};

#endif
/* wrapper.cpp 这个文件实现调用 C++ 的接口*/

#include "cpphfile.h"

extern "C" {

    struct wrapper_class{
        Myclass w_class;
    };

    struct wrapper_class* get_object()
    {
        return new struct wrapper_class;
    }

    void call_cpp_print(struct wrapper_class* p)
    {
        p->w_class.print();
    }

}
/* cfile.c */

#include <stdio.h>

struct wrapper_class *test;

int main()
{
    /* 创建对象 */
    test = get_object();

    /* 调用 C++ 函数 */
    call_cpp_print(test);
   
    system("pause");
}

小总结

extern "C" 应该只能在 CPP 文件或被引入到 CPP 中的头文件内声明。

通常应该这样使用 extern "C":
#ifdef __cplusplus
extern "C" {
#endif

/* your text */

#ifdef __cplusplus
}
#endif

C++ 编译器中已经定义了 __cplusplus 这个宏。

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址https://www.linuxidc.com/Linux/2019-02/157052.htm

linux
相关资讯       C++ 程序 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款