11

リンク リストの実装を C で書いていますが、C++ のテンプレートと同等の言語機能を使用して作業を容易にしたいと考えています。

そのような機能は存在しますか?

4

6 に答える 6

7

CにはC++のようなテンプレートはありませんが、マクロの「賢い」(または見方によってはWTFey)の使用と同様のことを実現でき#defineます。

ただし、たとえば、GLibが単一リンクリストまたは二重リンクリストに対してどのようにそれを行うかを見てください。

于 2013-02-07T08:14:14.367 に答える
5

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

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

Cでハッシュテーブルを実装しますが、単一および二重にリンクされた(さらには循環)リストを完全にマクロに実装するutlist.hもあります。つまり、このファイルを取得してインクルードし、これらのマクロをそのまま使用するか、必要に応じて変更することができます。また、任意のデータ構造を使用できることも優れています。ポインタがあれば十分です(二重リンクの場合は)。nextprev

追伸しかし、マクロを使用するときは常に覚えておいてください。大きな力には大きな責任が伴います。マクロは強力ですが、非常に安全でなく、判読できなくなる可能性があります。注意してください!

于 2013-02-07T08:30:14.647 に答える
3

はい、list.hがあります。そして、それは循環リンクリストです:

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

list.hは、定義、ヘッドの追加、テールの追加、削除、foreach関数などの循環リンクリストの管理に関連するすべての関数が含まれており、循環リンクリストを参照できます。

于 2013-02-07T08:12:50.153 に答える
1

こんにちは、連結リストについては知りませんが、テンプレート関数の場合、このプログラムの例として、さまざまな数の引数を持つマクロまたは関数をおそらく使用できます

#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
于 2017-02-27T02:36:45.187 に答える