2

残念ながらループが必要な任意のロジックを持つ配列初期化子を生成したいと考えています。

#define RANDOM_ARRAY(n) \
    ...

double array[] = RANDOM_ARRAY(10);

上記のコードが 10 要素の配列の初期化子を生成するとします。C99 でそのようなマクロ (ループ付き) を定義することは可能ですか?

注意: 関数呼び出しで十分な場合は、マクロである必要はありません (ただし、2 番目の関数ではなく、グローバル初期化子の間で呼び出すことができる必要があります)。

4

3 に答える 3

3

残念ながら、C で再帰 (またはループ) マクロ関数を作成することはできません。ただし、イニシャライザの最大長が妥当な場合は、次のタイプの構文を使用できます。

#define INITIALIZER(N)  { INITIALIZER_ ## N }
#define INITIALIZER_1   1
#define INITIALIZER_2   INITIALIZER_1, 2
#define INITIALIZER_3   INITIALIZER_2, 3


int
main(void)
{
    int tab[3] = INITIALIZER(3);

    return 0;
}
于 2013-05-14T12:45:32.410 に答える
1

C99 で作業しているので、もちろん初期化を行うマクロを作成できますが、初期化子のように見せることはできません。

#define INCREMENTING_ARRAY(t,a,n)    t a[n]; do {\
                                     for(size_t i = 0; i < n; ++i)\
                                       a[i] = i;\
                                     } while(0);

これにより、例として、要素がインクリメントするように初期化された配列が作成されます。

使用法:

int main(void)
{
  INCREMENTING_ARRAY(int, dozen, 12);
  int i;

  for(i = 0; i < sizeof dozen / sizeof *dozen; ++i)
    printf("array at %d = %d\n", i, dozen[i]);

  return 0;
}

これは、C99 では宣言とコードを自由に組み合わせることができるためint i; 、マクロの使用後に問題なく機能します。C89 では機能しませんでした。

于 2013-05-14T12:54:08.483 に答える