C代码中调用C++的函数

时间:2007-10-23 13:00:15  来源:本站搜集整理  作者:Eric

可以在C代码中调用C++的函数,要满足以下条件  
  *   被调用C++函数要使用extern   C声明,这样  
      o   多个重载函数中只能有一个函数被声明成extern   C,只有这个函数能  
          被C代码访问。  
      o   你不能在函数的参数列表中使用类和引用,C代码没办法处理引用或者  
          成员函数或者虚函数什么的。  
      o   你也没办法使用namespace,C代码不懂得这个。要在C代码中调用的  
          C++函数只能是全局作用域的。  
  *   main()函数要用C++编译器来编译,这是为了使C++代码中的全局变量和  
      类中的静态成员变量能够正确初始化。  
      o   如果一定要在C语言中实现main()函数  
          那可以在C++中定义  
          int   main(int   argc,   char*   argv[])  
          {  
                  return   main_in_C(argc,   argv);  
          }  
          然后在C语言中把int   main_in_C(int   argc,   char*   argv[]);函数当  
          作原先的main()函数来实现。  
  *   你的C编译器,C++编译器,连接程序得是同一个厂商出品的。不同的  
      厂商出品的编译器编译出的东东是不兼容的。

一个例子:

//////////////////////////////////////// cpp.h
#ifndef  __cpp_h__
#define  __cpp_h__

class  class1 {
    class1();
    ~class1();
public:
    int  I;
    int  J;

    int  getI(void);
};

#endif
//////////////////////////////////////// end file


//////////////////////////////////////// cpp.cpp
#i nclude "stdafx.h"
#i nclude  <iostream>
#i nclude  "cpp.h"
#i nclude  "c.h"

using namespace  std;       // 打开标准库名字空间

class1::class1()
{}

class1::~class1()
{}

int  class1::getI(void)
{
    return  I++;
}

// 按 C 调用方式编译下面函数
extern "C"
int  get_class1_I(struct1 * p)
{
    class1 * pClass1 = (class1 *)p;

    cout << "c++: " << pClass1->getI() << endl;

    return  pClass1->getI();
}

//////////////////////////////////////// end file


//////////////////////////////////////// c.h
#ifndef  __c_h__
#define  __c_h__

#ifdef  __cplusplus
extern "C" {
#endif

    typedef struct {
        int  i;             // 与 class1 类中变量一致
  int  j;
    }struct1;

#ifdef  __cplusplus
}
#endif
#endif
//////////////////////////////////////// end file


//////////////////////////////////////// c.c
#i nclude  <cstdio>
#i nclude  "c.h"

extern  int  get_class1_I(void * p);

struct1  s;

int  main(void)
{
    printf ("c: %d\n", get_class1_I(&s));
    printf ("c: %d\n", get_class1_I(&s));
 
    return 0;
}

//////////////////////////////////////// end file

参考了eCos中的混和编程实现方式(
http://sources.redhat.com/ecos/)。

本例在ADS 1.2中编译通过,执行结果正确。
VC++中编译时,C.C文件编译选项中选择 Not using precompile headers。

相关文章

文章评论

共有  4  位网友发表了评论 此处只显示部分留言 点击查看完整评论页面