C语言用宏实现静态多态

综述
多态性是面向对象程序设计的一个重要特征。

在C++语言中,多态指的是:具有不同功能的函数可以用同一个函数名,可以用一个函数名调用不同内容的函数。

C++的多态分为两种:

1. 静态多态性(编译时多态):在程序编译时系统就能决定调用的是哪个函数,因此称为编译时多态性

2. 动态多态性:在程序运行过程中才动态确定操作指针指向的对象,又被称为运行时多态

C++实现多态可以用虚函数,抽象类,覆盖以及模板实现

C语言是面向过程的语言,但同样可以实现多态性,可以通过宏实现编译时多态,用函数指针实现动态多态

C语言用宏实现编译时多态
例如以下例子是用宏实现双向链表的一部分

#include <stdio.h>
#include <stdlib.h>
 
#define INIT_LIST_TYPE(type)                    \
    typedef struct list_element_##type {        \
        struct list_element_##type* next, *pre; \
        void* val;                              \
    } list_element_##type;                      \
    typedef struct list_head_##type {           \
        list_element_##type* elem, *last;       \
        int length;                             \
    } list_head_##type;
 
#define list_element(type) \
    list_element_##type
 
#define list_head(type) \
    list_head_##type
 
#define LIST_FUNC_DECLARE(type)   \                                                          
    list_head_##type* init_list_##type();
                                                   
#define LIST_FUNC_INIT(type)   \
    _init_list(type)           
#define init_list(type) init_list_##type()
 
#define _init_list(type)                                                              \
    list_head_##type* init_list_##type()                                              \
    {                                                                                 \
        list_head_##type* h = (list_head_##type*)calloc(1, sizeof(list_head_##type)); \
        h->last = h->elem = NULL;                                                     \
        h->length = 0;                                                                \
        return h;                                                                     \
    }
 
#endif
调用

INIT_LIST_TYPE(int);
LIST_FUNC_INIT(int);
 
INIT_LIST_TYPE(float);
LIST_FUNC_INIT(float);
 
 
#define context_bam_elem list_element(int)
#define list_head_t list_head(int)
 
#define list_element_f_t list_element(float)
#define list_head_f_t list_head(float)
 
 
int main()
{
    list_head_t* h = init_list(int);
    list_head_f_t* h1 = init_list(float);
    
    return 0;
}
 
--------------------- 
作者:晏九 
来源:CSDN 
原文:https://blog.csdn.net/weixin_42670653/article/details/81385745 
版权声明:本文为博主原创文章,转载请附上博文链接!

转载于:https://my.oschina.net/u/4000302/blog/3020478

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值