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 
版權聲明:本文爲博主原創文章,轉載請附上博文連接!編譯

相關文章
相關標籤/搜索