当前位置: 技术问答>linux和unix
在Linux中将C++类转成C调用的问题,多谢指点
来源: 互联网 发布时间:2016-01-31
本文导语: 近日在使用linux编程中有了一个问题。 原来在windows下的vc中写了一个程序,主要是由一些类(类A,B,C,其中类A是用户接口类)实现的功能。现在将主要的功能移到linux下,并且可以被C语言调用。 第一步做的移植是在li...
近日在使用linux编程中有了一个问题。
原来在windows下的vc中写了一个程序,主要是由一些类(类A,B,C,其中类A是用户接口类)实现的功能。现在将主要的功能移到linux下,并且可以被C语言调用。
第一步做的移植是在linux下仍使用C++,将功能类A,B,C编译成.so文件,在C++测试程序中直接使用类A,运行正常;
第二步是向C移植,新建一些函数,这些函数用来包装类的构造、类函数的调用和类的析构,以供C程序调用。编译好.so后,当运行到类中的功能的时候,总是报“段错误”,通过修改程序的参数,绕过出错的地方,结果在别的地方错误。经检查发现错误是因为某些指针的值意外的变成0了(初始化的时候还是正确的值)。由此怀疑是C++向C转换封装的时候做的不对。请教大家应该怎么做:
其中封装C++类的文件:
#include
#include "A.h"
extern "C"{
typedef int CHANDLE;
#define MAXNUM 100
#include "head.h"
int Index=0;
A *a[MAXNUM];
//建立对象
CHANDLE CreatNewClassify()
{
if(ClassifyIndex==MAXNUM)//申请数量已经满了
return MAXNUM;
a[Index]=new A;
ClassifyIndex++;
return ClassifyIndex-1;
}
//调用类的方法
int Classify(CHANDLE handle,unsigned char* p_ip,unsigned int u_length,RULENO *rulenoresult)
{
a[handle]->NewIP(p_ip,u_length);
a[handle]->classify();
return 0;
}
//析构
int DeleteClassify(CHANDLE handle)
{
if(handle=MAXNUM)
return -1;
if(a[handle]==NULL)
return -2;
delete a[handle];
a[handle]=NULL;
return 0;
}
}//end extern "C"
在测试程序中,声明了上面三个函数(但是没有使用extern"C",因为用了就编译不过 ??)请问我这么转换有什么问题吗?多谢指点!
原来在windows下的vc中写了一个程序,主要是由一些类(类A,B,C,其中类A是用户接口类)实现的功能。现在将主要的功能移到linux下,并且可以被C语言调用。
第一步做的移植是在linux下仍使用C++,将功能类A,B,C编译成.so文件,在C++测试程序中直接使用类A,运行正常;
第二步是向C移植,新建一些函数,这些函数用来包装类的构造、类函数的调用和类的析构,以供C程序调用。编译好.so后,当运行到类中的功能的时候,总是报“段错误”,通过修改程序的参数,绕过出错的地方,结果在别的地方错误。经检查发现错误是因为某些指针的值意外的变成0了(初始化的时候还是正确的值)。由此怀疑是C++向C转换封装的时候做的不对。请教大家应该怎么做:
其中封装C++类的文件:
#include
#include "A.h"
extern "C"{
typedef int CHANDLE;
#define MAXNUM 100
#include "head.h"
int Index=0;
A *a[MAXNUM];
//建立对象
CHANDLE CreatNewClassify()
{
if(ClassifyIndex==MAXNUM)//申请数量已经满了
return MAXNUM;
a[Index]=new A;
ClassifyIndex++;
return ClassifyIndex-1;
}
//调用类的方法
int Classify(CHANDLE handle,unsigned char* p_ip,unsigned int u_length,RULENO *rulenoresult)
{
a[handle]->NewIP(p_ip,u_length);
a[handle]->classify();
return 0;
}
//析构
int DeleteClassify(CHANDLE handle)
{
if(handle=MAXNUM)
return -1;
if(a[handle]==NULL)
return -2;
delete a[handle];
a[handle]=NULL;
return 0;
}
}//end extern "C"
在测试程序中,声明了上面三个函数(但是没有使用extern"C",因为用了就编译不过 ??)请问我这么转换有什么问题吗?多谢指点!
|
在c 和c++很和使用时,extern "C"是告诉编译器,下边的是用c编写的.
|
用extern C做什么?