C语言用宏实现静态多态

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

在C++语言中,多态指的是:具备不一样功能的函数能够用同一个函数名,能够用一个函数名调用不一样内容的函数。.net

C++的多态分为两种:设计

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

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

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

C语言是面向过程的语言,但一样能够实现多态性,能够经过宏实现编译时多态,用函数指针实现动态多态element

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

#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
调用io

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 
版权声明:本文为博主原创文章,转载请附上博文连接!编译

相关文章
相关标签/搜索