2013-02-07 61 views
6

我正在用C編寫一個鏈表實現,並且希望使用與C++的模板等效的語言特性,以使我的工作更輕鬆。C編程語言中是否有模板?

這樣的功能是否存在?

+1

這是什麼意思的「模板」在這種情況下? – cnicutar

+2

模板是C++編程語言的一個功能,它允許函數和類使用泛型類型進行操作。 – 2013-02-07 08:10:56

+0

非常感謝你 – user1722022

回答

2

是的,有list.h。它是一個循環鏈表:

以下鏈接包含如何使用它的example

list.h包含與像定義循環鏈表的管理的所有功能,加入了頭,添加在尾部,刪除的foreach功能瀏覽循環鏈表...

+1

這是針對Linux內核的一個答案,它不是關於它如何在「C」中的一般答案。我覺得很奇怪,它被選中了。 – unwind

+2

@unwind:我知道在內核linux中使用了list.h。但在鏈接中,我給list.h的這個答案是list.h的另一個發行版,它在linux的用戶空間中工作,並且它是可移植的。我在我開發的所有用戶空間應用程序中使用它,並且它工作正常。 – MOHAMED

+0

@unwind請參閱本段中的鏈接我給出的答案作爲示例http://isis.poly.edu/kulesh/stuff/src/klist/'只需很少的修改(刪除硬件預取列表項),我們可以在我們的應用程序中也使用這個列表這個文件的可用版本可以在這裏下載。' – MOHAMED

6

C有沒有像C++這樣的模板,儘管你可以通過使用#define宏來實現類似於「聰明」(或者WTFey,取決於你如何看待它)的東西。

然而,看看例如GLib如何爲singly linked listsdoubly linked lists做。

+1

+1或「WTFey」 – Brendan

3

模板是C++的功能,但如果你想單電荷或雙鏈表的類型無關的實現,它可以與宏的幫助下進行,也可以簡單地存儲void*指針在你的結構。

當然,在互聯網上有很多這樣的實現。 @MohamedKALLEL@hyde已經給出了一個來自Linux內核和GLib的例子,我想添加一個關於漂亮的小型庫uthash的說明。

它實現在C語言的哈希表,但它也有一個utlist.h實現單電荷和雙向鏈接(甚至圓形)上的宏列出完全。也就是說,您可以簡單地使用此文件,將其包含在內,並按原樣使用這些宏,或者根據需要對其進行修改。另外不錯的是,你可以使用它的任何數據結構:它只需要有next指針(在雙重鏈接的情況下爲prev)。

P.s.但總是記得使用宏時:大功率帶來很大的責任。宏是強大的,但可能會變得非常不安全和不可讀。謹防!

0

您好,我不知道鏈表但對於一個模板函數u大概可以使用宏或具有不同數量的參數作爲一個例子該程序的功能

#include <stdarg.h> 
#include <stdio.h> 
#define INT 0 
#define STR 1 
void foo(int type, ...) 
{ 
    va_list ap; 
    int i; 
    char *s; 
    va_start(ap, type); 
    switch(type) { 
    case INT: 
     i = va_arg(ap, int); 
     printf("INT: %i\n", i); 
     break; 
    case STR: 
     s = va_arg(ap, char *); 
     printf("STR: %s\n", s); 
     break; 
    default: 
     break; 
    } 
    va_end(ap); 
} 
#define SWAP(type, a, b) {     \ 
     type t;         \ 
     t = a;         \ 
     a = b;         \ 
     b = t;         \ 
    } 
int main(void) 
{ 
    foo(INT, 3); 
    foo(STR, "baz"); 
    int ia = 0, ib = 3; 
    SWAP(int, ia, ib); 
    printf("%i %i\n", ia, ib); 
    float fa = 0.5, fb = 3.14; 
    SWAP(float, fa, fb); 
    printf("%f %f\n", fa, fb); 
    return 0; 
} 

時會產生輸出

INT: 3 
STR: baz 
3 0 
3.140000 0.500000