リンク リストの実装を C で書いていますが、C++ のテンプレートと同等の言語機能を使用して作業を容易にしたいと考えています。
そのような機能は存在しますか?
テンプレートはC++の機能ですが、単一または二重にリンクされたリストの型に依存しない実装が必要な場合は、マクロを使用して作成するかvoid*
、構造体にポインターを格納するだけです。
もちろん、インターネット上にはそのような実装がたくさんあります。@MohamedKALLELと@hydeはすでにLinuxカーネルとGLibからの例を示していますが、ちょっとしたライブラリuthashについてのメモを追加したいと思います。
Cでハッシュテーブルを実装しますが、単一および二重にリンクされた(さらには循環)リストを完全にマクロに実装するutlist.hもあります。つまり、このファイルを取得してインクルードし、これらのマクロをそのまま使用するか、必要に応じて変更することができます。また、任意のデータ構造を使用できることも優れています。ポインタがあれば十分です(二重リンクの場合は)。next
prev
追伸しかし、マクロを使用するときは常に覚えておいてください。大きな力には大きな責任が伴います。マクロは強力ですが、非常に安全でなく、判読できなくなる可能性があります。注意してください!
こんにちは、連結リストについては知りませんが、テンプレート関数の場合、このプログラムの例として、さまざまな数の引数を持つマクロまたは関数をおそらく使用できます
#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