* 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++のテンプレートに近い機能を提供していることになります。

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS