2013-02-07 4 views
6

私はリンクリストの実装をC言語で書いており、C++のテンプレートに相当する言語機能を使いたいと思います。Cプログラミング言語のテンプレートはありますか?

このような機能はありますか?

+1

ここで「テンプレート」とはどういう意味ですか? – cnicutar

+2

テンプレートは、関数とクラスがジェネリック型で動作することを可能にするC++プログラミング言語の機能です。 –

+0

ありがとうございました – user1722022

答えて

2

はいあります。list.hです。また、循環リンクリスト:

次のリンクには、それを使用する方法のexampleが含まれています。

list.hは、定義のような円形のリンクリストの管理に関連するすべての機能が含まれ、頭に追加し、尾に追加、削除、循環リンクリストを閲覧するforeachの機能...

+1

これはLinuxカーネル固有の回答ですが、 "in C"の一般的な回答ではありません。私はそれが投票されたことが奇妙なことがわかります。 – unwind

+2

@unwind:list.hがカーネルのlinuxで使われていることは分かっています。しかし、私は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 listsまたはdoubly linked listsのためにどのように処理するかを見てみましょう。

+1

+1または "WTFey" – Brendan

3

テンプレートはC++の機能ですが、一重または二重リンクリストの型に依存しない実装を希望する場合は、マクロの助けを借りて作成するか、単純に構造体にvoid*ポインタを格納します。

もちろん、このような実装はインターネット上にたくさんあります。 @MohamedKALLEL@hydeはすでにLinuxカーネルとGLibからの例を示しています。ちょっとしたライブラリであるuthashに関する注釈を追加したいと思います。

それはCでハッシュテーブルを実装し、それはまたsingly-と二重結合(さらに円形の)実装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 
関連する問題