欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
在C中調用C++動(dòng)態(tài)庫函數
1.寫(xiě)一個(gè)C++的庫用來(lái)測試cpplib.h:
===================
class Add{
public:
    int add(int a,int b);
};

cpplib.cpp:
================================
int Add::add(int a,int b){
    return (a+b);
}

編譯:
cpplib:cpplib.cpp
    g++ -o libcpplib.so cpplib.cpp -fPIC -shared

就可以生成一個(gè)測試庫libcpplib.so

2.增加用于C的接口:
寫(xiě)一個(gè)接口頭文件cpplib_interface.h
===================================
#ifdef __cplusplus
extern "C"
{
#endif
int add(int a,int b);
#ifdef __cplusplus
}
#endif
為了省時(shí)間,把實(shí)現寫(xiě)在cpplib.cpp中:
========================
#include "cpplib_interface.h"
int add(int a,int b){
    Add x;
    return x.add(a,b);
}

然后重新編譯生成libcpplib.so,現在這個(gè)函數提供了用于C的接口,使用nm看一下:
nm libcpplib.so | grep add
    0000053c T _ZN3Add3addEii
    00000549 T add

3.測試:
寫(xiě)一個(gè)main.c
===========================
#include
#include "cpplib_interface.h"

int main(int argc ,char*argv[]){
    int a=10,b=7;
    printf("10+7=%d\n",add(a,b));
    return 0;
}
編譯:
gcc -o main  main.c -L. -lcpplib

運行:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/media/d/nfs/c_call_cpplib   (這里是增加libcpplib.so庫所在的路徑到運行庫搜索路徑)
./main

運行結果:
    10+7=17

總結:
    在C++中使用extern “C“ 聲明的函數,會(huì )生成兩套接口,一個(gè)用于c++,一個(gè)用于C。

擴展:
    有時(shí)候在C里面調用C++庫函數時(shí),也需要維護一個(gè)對像,這樣的話(huà)就需要引入一個(gè)機制。
使用id來(lái)管理類(lèi)對象
修改cpplib_interface.h
=============================
#ifdef __cplusplus
extern "C"
{
#endif
int create_obj();
void destroy_obj(int id);
int add(int id,int a,int b);
#ifdef __cplusplus
}
#endif

修改cpplib.cpp
==============================
#define OBJ_COUNT 128
struct obj_list_t{
    unsigned int id;
    Add *obj;
}obj_list[OBJ_COUNT];

int create_obj()
{
    int i;
    for (i=0;i        if (obj_list[i].id==0) {//free
            break;
        }
    }
    if (i==OBJ_COUNT) {
        return -1;//error
    }
    obj_list[i].id=i+1;
    obj_list[i].obj=new Add();
    return obj_list[i].id;
}

void destroy_obj(int id)
{
    int i;
    for (i=0;i        if (obj_list[i].id==id) {//free
            break;
        }
    }
    if (i==OBJ_COUNT) {
        return ;//error
    }
    obj_list[i].id=0;
    delete obj_list[i].obj;
}

static Add* get_obj(int id)
{
    int i;
    for (i=0;i        if (obj_list[i].id==id) {//free
            break;
        }
    }
    if (i==OBJ_COUNT) {
        return 0;//error
    }
    return obj_list[i].obj;
}

int add(int id,int a,int b){
    Add* x=get_obj(id);
    if (x!=0) {
        return x->add(a, b);
    }else{
        return 0;
    }
}

重新編譯生成庫
修改main.c
======================
int main(int argc ,char*argv[]){
    int a=10,b=7;
    int id=create_obj();
    printf("id=%d 10+7=%d\n",id,add(id,a,b));
    destroy_obj(id);
    return 0;
}
運行結果如下:
    id=1 10+7=17

總結:
    使用id來(lái)映射類(lèi)的對象,就像很多SDK里面的句柄一樣。
   
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
最近研讀深入理解計算機系統之函數調用前參數壓棧
用c語(yǔ)言寫(xiě)動(dòng)態(tài)庫
在Linux上使用共享庫
extern
形參與實(shí)參
CPU 指令
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久