* longdefの使い方
-(by [[K]], 2024.09.03)
** (0)
-[[acpp0>a24_acpp0]]は、longdefをサポートします。これがどういう機能なのか説明します。
** (1)
-C言語では、大きさnのintの配列を受け取って最大値を返す関数はたとえばこう書きます。
int maxArray(int *a, int n)
{
int i, m = a[0];
for (i = 1; i < n; i++) {
if (m < a[i]) m = a[i];
}
return m;
}
-これはintでの比較ですが、charやshortやlongやfloatやdoubleの配列に対しても、同じようなことをしたくなるかもしれません。そのたびに関数を作るのでしょうか。maxArrayInt()とか、maxArrayDouble()とか。
-でもそれって面倒だしバグの温床です(単調な書き分けはミスりやすい、修正時にやりわすれが発生しやすい)。だからこうします。
#define maxArray(x) ACat(maxArray_, x)
#longdef longdef_maxArray(typ)
typ maxArray(typ)(typ *a, int n)
{
int i; typ m = a[0];
for (i = 1; i < n; i++) {
if (m < a[i]) m = a[i];
}
return m;
}
#endlongdef
#longuse longdef_maxArray(int) // ここに関数が作られる
#longuse longdef_maxArray(float) // ここに関数が作られる
int a[100] = { ... };
float b[100] = { ... };
void func()
{
printf("max=%d\n", maxArray(int)(a, 100));
printf("max=%f\n", maxArray(float)(b, 100));
}
-こんなふうに、#longuseするたびに関数が作られることになります。
-これはC++のテンプレートに近い機能を提供していることになります。