最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ API功能設(shè)計(jì)的實(shí)現(xiàn)

 更新時(shí)間:2022年08月30日 08:46:45   作者:Colin-YYYY  
C++ API中看似很小的修改,都可能會(huì)影響到生成的對(duì)象和庫(kù)文件的二進(jìn)制表示,如果客戶(hù)想替換共享庫(kù)使之工作,就不能簡(jiǎn)單的替換庫(kù)文件了事,而往往需要重新編譯

前言

創(chuàng)建類(lèi)來(lái)表示API中的每個(gè)關(guān)鍵對(duì)象,同時(shí)提供這些類(lèi)的方法

此處的API風(fēng)格指的是如何表現(xiàn)API的功能,以下4種:

  • C API

可以用C編譯器編譯的API。這種API只包含一組自由函數(shù)以及輔助的數(shù)據(jù)結(jié)構(gòu)和常量。這種風(fēng)格的接口不包含對(duì)象或繼承,因此被稱(chēng)為純C模式

  • 面向?qū)ο蟮?code>C++ API

這種風(fēng)格涉及對(duì)象(其中包含相關(guān)的數(shù)據(jù)與方法)的使用以及繼承、封裝和多態(tài)等概念的應(yīng)用

  • 基于模板的API

通過(guò)模板功能,C++也支持泛型編程和元編程。它支持以泛型類(lèi)型的方式編寫(xiě)函數(shù)和數(shù)據(jù)結(jié)構(gòu),在以后使用時(shí),泛型類(lèi)型可以通過(guò)具體類(lèi)型來(lái)實(shí)例化,從而實(shí)現(xiàn)特化

  • 數(shù)據(jù)驅(qū)動(dòng)型API

這類(lèi)接口的特點(diǎn)是,將參數(shù)通過(guò)靈活的數(shù)據(jù)結(jié)構(gòu)打包,連同命名的命令一起發(fā)送給處理程序,而不是調(diào)用特定的方法和自由函數(shù)

純C API

C語(yǔ)言不支持對(duì)象封裝和繼承層次結(jié)構(gòu)等概念,因此,純C語(yǔ)法的API必須使用一組更為受限的語(yǔ)言特性來(lái)表示,比如typedef、結(jié)構(gòu)體和全局命名空間中的函數(shù)調(diào)用等。因?yàn)?code>C語(yǔ)言中沒(méi)有namespace關(guān)鍵字,要避免與其他C庫(kù)中的名字發(fā)生沖突,對(duì)這種風(fēng)格的API而言,所有公開(kāi)的函數(shù)和數(shù)據(jù)結(jié)構(gòu)應(yīng)該使用一個(gè)公共的前綴

當(dāng)然,也可以使用內(nèi)部鏈接隱藏實(shí)現(xiàn)中的符號(hào)名,比如將符號(hào)名聲明為靜態(tài)的,這樣它們的作用域就限制在.c文件之中了。通過(guò)這種方式,可以確保任何這樣的函數(shù)都不會(huì)被導(dǎo)出到外部,從而不會(huì)導(dǎo)致符號(hào)沖突

// c++ 示例
class Stack
{
public:
    void Push(int val);
    int Pop();
    bool IsEmpty() const;
private:
    int *mStack;
    int mCurSize;
};
// 純C API
struct Stack
{
    int *mStack;
    int mCurSize;
};
void StackPush(struct Stack *stack, int val);
int StackPop(struct Stack *stack);
bool StackIsEmpty(const struct Stack *stack);
// 進(jìn)一步改進(jìn)
typedef struct Stack *StackPtr;
void StackPush(StackPtr stack, int val);
int StackPop(StackPtr stack);
bool StackIsEmpty(const StackPtr stack);
// 可以通過(guò)特定的API調(diào)用來(lái)完成數(shù)據(jù)庫(kù)結(jié)構(gòu)的創(chuàng)建與銷(xiāo)毀
StackPtr StackCreate();
void StackDestory(StackPtr stack);

C API的頭文件中使用extern "C"限制,以便C++程序能夠正確的編譯和鏈接C API

#ifdef _cplusplus
extern "C" {
#endif
// C API聲明
#ifdef _cplusplus
}
#endif

面向?qū)ο蟮腃++ API

過(guò)程式編程、泛型編程、函數(shù)式編程

使用面向?qū)ο蟮?code>C++概念創(chuàng)建二進(jìn)制兼容的API是極為困難的

基于模板的API

模板可以用來(lái)編寫(xiě)在編譯時(shí)生成代碼或執(zhí)行代碼的程序(該技術(shù)稱(chēng)為元編程)

模板可以在編譯時(shí)執(zhí)行一些工作,進(jìn)而改進(jìn)運(yùn)行時(shí)性能

#include <vector>
template <typename T>
class Stack
{
public:
    void Push(T val);
    T Pop();
    bool IsEmpty() const;
private:
    std::vector<T> mStack;
};
// 可以定義一個(gè)typedef,這樣就可以更方便地使用該模板實(shí)例了
typedef Stack<int> IntStack;
IntStack *stack = new IntStack();

模板實(shí)現(xiàn)方式的另一個(gè)選擇是,利用C預(yù)處理器來(lái)定義一段文本,可以將其放入多個(gè)頭文件中

#include <vector>
#define DECLARE_STACK(Prefix, T) \
class Prefix##Stack \
{ \
public: \
    void Push(T val); \
    T Pop(); \
    bool IsEmpty() const; \
    
private: \
    std::vector<T> mStack; \
}
DECLARE_STACK(Int, int);

模板提供了一種類(lèi)型安全的在編譯時(shí)生成代碼的方式。你可以調(diào)試到類(lèi)模板的時(shí)機(jī)代碼行中。除非你要編寫(xiě)純C API,無(wú)法使用模板,否則就應(yīng)該避免使用預(yù)處理器來(lái)模擬模板

模板的一個(gè)重要屬性是,不同于使用繼承時(shí)的動(dòng)態(tài)(運(yùn)行時(shí))多態(tài),它支持靜態(tài)(編譯時(shí))多態(tài)

不會(huì)像虛方法那樣存在運(yùn)行時(shí)代價(jià)

模板進(jìn)一步的益處,對(duì)于特定類(lèi)型的實(shí)例類(lèi),可以特化它的某些方法

template <>
void Stack<int>::Push(int val)
{
    // 實(shí)現(xiàn)特定于int類(lèi)型的壓棧功能
}

基于模板的API的缺點(diǎn)

  • 最嚴(yán)重的問(wèn)題是:類(lèi)模板的定義通常必須出現(xiàn)在公開(kāi)的頭文件中
  • 因?yàn)橐鼗0澹幾g器必須能夠訪(fǎng)問(wèn)模板代碼的完整定義,顯而易見(jiàn),這會(huì)暴露內(nèi)部細(xì)節(jié)
  • 每當(dāng)其他文件包含了類(lèi)模板定義所在的頭文件時(shí),內(nèi)聯(lián)的代碼都需要重新編譯,生成的代碼會(huì)被添加到每個(gè)使用該API的模塊的目標(biāo)文件。這會(huì)增加編譯時(shí)間,并致使代碼膨脹
  • 實(shí)際上有些情況下你可以使用顯式實(shí)例化技術(shù)將模板的實(shí)現(xiàn)隱藏在.cpp文件中
  • 模板的另一個(gè)缺點(diǎn)是,模板代碼中出現(xiàn)錯(cuò)誤時(shí),大多數(shù)編譯器生成的報(bào)錯(cuò)信息都是冗長(zhǎng)且令人困惑的,可用STLFilt

相對(duì)于運(yùn)行時(shí)開(kāi)銷(xiāo)而言,代碼體積是需要優(yōu)先考慮的因素,那么應(yīng)該選擇面向?qū)ο蠓桨?,而非模板?;蛘呦喾?,如果運(yùn)行時(shí)性能更為重要,那就應(yīng)該選擇模板

數(shù)據(jù)驅(qū)動(dòng)型API

數(shù)據(jù)驅(qū)動(dòng)型程序指的是:通過(guò)每次運(yùn)行時(shí)提供不同的輸入數(shù)據(jù),它可以執(zhí)行不同的操作

優(yōu)點(diǎn)

  • 對(duì)于API將來(lái)可能發(fā)生的變化,它的容錯(cuò)性更強(qiáng)
  • 可以更容易地支持?jǐn)?shù)據(jù)驅(qū)動(dòng)型測(cè)試技術(shù)p143

API支持可變參數(shù)列表

  • 聯(lián)合體
  • 繼承
  • void *

到此這篇關(guān)于C++ API功能設(shè)計(jì)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C++ API內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)俄羅斯方塊

    C語(yǔ)言實(shí)現(xiàn)俄羅斯方塊

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)俄羅斯方塊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • C++ 關(guān)于MFC多線(xiàn)程編程的注意事項(xiàng)

    C++ 關(guān)于MFC多線(xiàn)程編程的注意事項(xiàng)

    這篇文章主要介紹了C++ 關(guān)于MFC多線(xiàn)程編程的注意事項(xiàng)的相關(guān)資料,需要的朋友可以參考下
    2015-06-06
  • C++高精度計(jì)時(shí)的幾種方法總結(jié)(測(cè)試函數(shù)運(yùn)行時(shí)間)

    C++高精度計(jì)時(shí)的幾種方法總結(jié)(測(cè)試函數(shù)運(yùn)行時(shí)間)

    本文介紹了C++中常用的幾種程序計(jì)時(shí)方法,包括clock()函數(shù)、GetTickCount()、QueryPerformanceCounter()以及C++11中的chrono庫(kù)函數(shù),這篇文章主要介紹了C++高精度計(jì)時(shí)的幾種方法,需要的朋友可以參考下
    2024-09-09
  • 淺談c++11線(xiàn)程的互斥量

    淺談c++11線(xiàn)程的互斥量

    互斥量是個(gè)類(lèi)對(duì)象,理解成一把鎖(保護(hù)共享數(shù)據(jù),其他想操作共享數(shù)據(jù)的線(xiàn)程必須等待解鎖),互斥量使用要小心,保護(hù)數(shù)據(jù)不多也不少,少了則沒(méi)達(dá)到保護(hù)效果,多了則影響效率。本文將介紹c++11線(xiàn)程的互斥量,感興趣的同學(xué),可以參考下。
    2021-06-06
  • C語(yǔ)言簡(jiǎn)明分析指針與引用的具體用法

    C語(yǔ)言簡(jiǎn)明分析指針與引用的具體用法

    指針是一個(gè)實(shí)體,引用是一個(gè)別名;在匯編上,引用的底層是以指針的方式實(shí)現(xiàn)的,定義一個(gè)引用變量,相當(dāng)于定義了一個(gè)指針,然后把引用內(nèi)存的地址寫(xiě)到這個(gè)指針里面,當(dāng)通過(guò)引用變量修改它所引用的內(nèi)存時(shí),它先訪(fǎng)問(wèn)了指針里面的地址,然后在這個(gè)地址的內(nèi)存里面對(duì)值進(jìn)行修改
    2022-05-05
  • C++ 內(nèi)聯(lián)函數(shù)詳解

    C++ 內(nèi)聯(lián)函數(shù)詳解

    內(nèi)聯(lián)函數(shù)是c++為了提高程序的運(yùn)行速度做的改進(jìn),本片文章詳細(xì)介紹了C++ 的內(nèi)聯(lián)函數(shù),本文就來(lái)詳細(xì)的介紹一下,感興趣的朋友可以了解一下
    2021-11-11
  • C++實(shí)現(xiàn)本地TCP通訊的示例代碼

    C++實(shí)現(xiàn)本地TCP通訊的示例代碼

    這篇文章主要為大家詳細(xì)介紹了C++如何利用TCP技術(shù),實(shí)現(xiàn)本地ROS1和ROS2的通訊,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • C語(yǔ)言算法學(xué)習(xí)之雙向鏈表詳解

    C語(yǔ)言算法學(xué)習(xí)之雙向鏈表詳解

    雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個(gè)數(shù)據(jù)結(jié)點(diǎn)中都有兩個(gè)指針,分別指向直接后繼和直接前驅(qū)。本文主要介紹了C語(yǔ)言算法中雙向鏈表的實(shí)現(xiàn),需要的可以參考一下
    2022-05-05
  • Qt QFtp客戶(hù)端實(shí)現(xiàn)上傳下載文件

    Qt QFtp客戶(hù)端實(shí)現(xiàn)上傳下載文件

    本文主要介紹了Qt QFtp客戶(hù)端實(shí)現(xiàn)上傳下載文件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 用C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單掃雷游戲

    用C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了用C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07

最新評(píng)論

达州市| 哈巴河县| 桓仁| 寻甸| 体育| 玛纳斯县| 定陶县| 旅游| 桐庐县| 曲靖市| 临漳县| 肇东市| 洪江市| 论坛| 丽江市| 新泰市| 丹巴县| 宽甸| 龙州县| 德安县| 策勒县| 广东省| 鹤山市| 武邑县| 读书| 洪洞县| 绥宁县| 怀柔区| 咸宁市| 体育| 页游| 贵德县| 松江区| 盐边县| 广南县| 连平县| 望奎县| 成安县| 周至县| 临夏市| 舟曲县|