Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1550346
  • 博文数量: 596
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 173
  • 用 户 组: 普通用户
  • 注册时间: 2016-07-06 15:50
个人简介

在线笔记

文章分类

全部博文(596)

文章存档

2016年(1)

2015年(104)

2014年(228)

2013年(226)

2012年(26)

2011年(11)

分类: C/C++

2013-03-15 23:01:17



C调用C++开战咯


为方便查找,正确的是
1.非成员函数的2),4)




1.非成员函数


1)没有extern "C"
//interface.cpp,
void null()
{
}


$ g++ -c interface.cpp
$ nm interface.o
00000000 T _Z4nullv
         U __gxx_personality_v0


2).有extern "C"
//interface.cpp
extern "C" void null();//直接在CPP文件中加上extern "C"


void null()
{
}
$ g++ -c interface.cpp
$ nm interface.o
         U __gxx_personality_v0
00000000 T null


3)把extern "C"放在头文件里面,忘了包含头文件


//interface.h
#ifndef INTERFACE_H
#define INTERFACE_H


#ifdef __cplusplus
extern "C" {
#endif
    void null();
#ifdef __cplusplus
}
#endif


#endif


//interface.cpp,没有保护该头文件。。。这是不行的


void null()
{
}
$ nm interface.o
         U __gxx_personality_v0
00000000 T null


4)正确的做法是,包含对应的头文件


//interface.h
#ifndef INTERFACE_H
#define INTERFACE_H


#ifdef __cplusplus
extern "C" {
#endif
    void null();
#ifdef __cplusplus
}
#endif


#endif


//interface.cpp
#include "interface.h"//包含对应的头文件
void null()
{
}


综上,2),4)是正确的,1),3)使用不正确


2.成员函数


1)类头文件,没变化
//add.h
#ifndef ADD_H_
#define ADD_H_
class add {
public:
    add(){};
    ~add(){};


    int doo(int m, int n); 
    void out(int m); 
};


#endif
2)类的实现函数,不变


#include
#include "add.h"


using namespace std;


    
int add::doo(int m, int n)
{
    return m + n;
}


void add::out(int m)
{
    cout << m << endl;
}




3)接下来是给类套一个壳,这个比较麻烦,看仔细了




//interface.cpp
#include "add.h"// 1)类的头文件
#include "interface.h"// 2)里面包含了extern "C" void test(),不能漏掉


void test()
{
    add a;
    a.out(a.doo(1, 1));
}


//interface.h
#ifndef INTERFACE_H
#define INTERFACE_H


#ifdef __cplusplus//注意,这边加了__cplusplus,因为c文件会包含这个头文件,这样GCC编译时,就没有extern "C"
extern "C" {
#endif


  void test();


#ifdef __cplusplus
}
#endif


#endif


4)最后主函数调用
//main.c
#include
#include "interface.h"


int main(int argc, char **argv)
{
    test();


    return 0;
}
$ gcc -c main.c
$ gcc main.o interface.o add.o -lstdc++


5)最后分析下.o文件
$nm add.o
00000079 t _GLOBAL__I__ZN3add3dooEii
00000039 t _Z41__static_initialization_and_destruction_0ii
00000000 T _ZN3add3dooEii
0000000e T _ZN3add3outEi
         U _ZNSolsEPFRSoS_E
         U _ZNSolsEi
         U _ZNSt8ios_base4InitC1Ev
         U _ZNSt8ios_base4InitD1Ev
         U _ZSt4cout
         U _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
00000000 b _ZStL8__ioinit
         U __cxa_atexit
         U __dso_handle
         U __gxx_personality_v0
可以看出,这些都是C++的


$ nm interface.o
         U _Unwind_Resume
         U _ZN3add3dooEii
         U _ZN3add3outEi
00000000 W _ZN3addC1Ev
00000000 W _ZN3addD1Ev
         U __gxx_personality_v0
0000006c T null
00000000 T test
可以看出,test是按C的函数编译的


$ nm main.o
00000000 T main
         U test
可以看出,main.c的test和interface.cpp的一样,也就是可以调用了。


重点就是多了一个C++文件封装了C++的类,不过这个文件要用G++来编译,不然类编译不过去
阅读(825) | 评论(0) | 转发(0) |
0

上一篇:X11 字体

下一篇:C++调用C

给主人留下些什么吧!~~