文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C++API功能设计的实现

2024-04-02 19:55

关注

前言

创建类来表示API中的每个关键对象,同时提供这些类的方法

此处的API风格指的是如何表现API的功能,以下4种:

可以用C编译器编译的API。这种API只包含一组自由函数以及辅助的数据结构和常量。这种风格的接口不包含对象或继承,因此被称为纯C模式

这种风格涉及对象(其中包含相关的数据与方法)的使用以及继承、封装和多态等概念的应用

通过模板功能,C++也支持泛型编程和元编程。它支持以泛型类型的方式编写函数和数据结构,在以后使用时,泛型类型可以通过具体类型来实例化,从而实现特化

这类接口的特点是,将参数通过灵活的数据结构打包,连同命名的命令一起发送给处理程序,而不是调用特定的方法和自由函数

纯C API

C语言不支持对象封装和继承层次结构等概念,因此,纯C语法的API必须使用一组更为受限的语言特性来表示,比如typedef、结构体和全局命名空间中的函数调用等。因为C语言中没有namespace关键字,要避免与其他C库中的名字发生冲突,对这种风格的API而言,所有公开的函数和数据结构应该使用一个公共的前缀

当然,也可以使用内部链接隐藏实现中的符号名,比如将符号名声明为静态的,这样它们的作用域就限制在.c文件之中了。通过这种方式,可以确保任何这样的函数都不会被导出到外部,从而不会导致符号冲突

// 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);
// 进一步改进
typedef struct Stack *StackPtr;
void StackPush(StackPtr stack, int val);
int StackPop(StackPtr stack);
bool StackIsEmpty(const StackPtr stack);
// 可以通过特定的API调用来完成数据库结构的创建与销毁
StackPtr StackCreate();
void StackDestory(StackPtr stack);

C API的头文件中使用extern "C"限制,以便C++程序能够正确的编译和链接C API

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

面向对象的C++ API

过程式编程、泛型编程、函数式编程

使用面向对象的C++概念创建二进制兼容的API是极为困难的

基于模板的API

模板可以用来编写在编译时生成代码或执行代码的程序(该技术称为元编程)

模板可以在编译时执行一些工作,进而改进运行时性能

#include <vector>
template <typename T>
class Stack
{
public:
    void Push(T val);
    T Pop();
    bool IsEmpty() const;
private:
    std::vector<T> mStack;
};
// 可以定义一个typedef,这样就可以更方便地使用该模板实例了
typedef Stack<int> IntStack;
IntStack *stack = new IntStack();

模板实现方式的另一个选择是,利用C预处理器来定义一段文本,可以将其放入多个头文件中

#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);

模板提供了一种类型安全的在编译时生成代码的方式。你可以调试到类模板的时机代码行中。除非你要编写纯C API,无法使用模板,否则就应该避免使用预处理器来模拟模板

模板的一个重要属性是,不同于使用继承时的动态(运行时)多态,它支持静态(编译时)多态

不会像虚方法那样存在运行时代价

模板进一步的益处,对于特定类型的实例类,可以特化它的某些方法

template <>
void Stack<int>::Push(int val)
{
    // 实现特定于int类型的压栈功能
}

基于模板的API的缺点

相对于运行时开销而言,代码体积是需要优先考虑的因素,那么应该选择面向对象方案,而非模板。或者相反,如果运行时性能更为重要,那就应该选择模板

数据驱动型API

数据驱动型程序指的是:通过每次运行时提供不同的输入数据,它可以执行不同的操作

优点

API支持可变参数列表

到此这篇关于C++ API功能设计的实现的文章就介绍到这了,更多相关C++ API内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯