2015-09-06 101 views
0

我有遍歷二叉搜索樹 traverse(node_t*),其中一個功能:使用與結構的不同定義相同的代碼

typedef struct node_t{ 
    char *key; 
    char *item; 
    struct node_t *parent; 
    struct node_t *left; 
    struct node_t *right; 
}node_t; 

我將能夠使用相同的功能traverse(node_t*)不同結構在相同的標識符下通過對頭文件做些什麼? 例如一個不同的結構,如:

typedef struct node_t{ 
    char *key; 
    char *item; 
    struct node_t *parent; 
    struct node_t *left; 
    struct node_t *right; 
    struct node_t *next; 
}node_t; 

其中我只是簡單地添加一個成員的結構,不會在函數中訪問。

+0

是的,這是可能的。當然,這些功能必須有不同的名稱才能區分它們,所以你需要一些宏觀詭計。檢查linux內核源代碼的一些想法。 –

+0

C不允許重載或繼承。但是,如果將數據字段移動到管理字段之外,則可以編寫只能在管理字段上操作的通用函數。缺點是你必須在晚些時候投出實際的類型。 – Olaf

+0

你不應該有相同結構的兩個不同的聲明。 – immibis

回答

0

這是可能的,但不推薦。

首先,如果您只包含一個定義樹結構的文件,則可以實現此目的。最簡單的方法是定義某種虛擬預處理器常量,該常量定義要包含哪個文件。例如:

#define INCLUDE_TREE_WITH_PARENT 
#ifdef INCLUDE_TREE_WITH_PARENT 
    #include "tree_with_parent.h" 
#else INCLUDE_TREE_WITH_PARENT 
    #include "tree.h" 
#end 

但是,你只能使用是常見的兩種類型的在功能樹,因爲如果你使用不包含的是類型定義的字段,代碼甚至不會編譯場。

這是非常棘手的,可以迷惑人誰是閱讀你的代碼,因爲這種「模板」節目爲C.

是不常見的
相關問題