5

Cにプリプロセッサ変数のようなものはありますか? それは私の定義を単純化することができます。

現在、私は次のようなものを持っています:

typedef struct mystruct {
  int val1;
  int val2;
  int val3;
  int val4;
} MYSTRUCT;

typedef struct mysuperstruct {
  MYSTRUCT *base;
  int val;
} MYSUPERSTRUCT;


#define MY_OBJECT_BEGIN(name, val1, val2, val3, val4) \
  MYSTRUCT name##Base = { val1, val2, val3, val4 }; \
  MYSUPERSTRUCT * name##Objs = {

#define MY_OBJECT_VALUE(name, val) \
  { &(name##Base), val },

#define MY_OBJECT_END() \
  NULL \
};

次のように使用されます。

MY_OBJECT_BEGIN(obj1, 1, 2, 3, 4)
MY_OBJECT_VALUE(obj1, 5)
MY_OBJECT_VALUE(obj1, 6)
MY_OBJECT_VALUE(obj1, 7)
MY_OBJECT_END()

次のようなものが生成されます。

MYSTRUCT obj1Base = { 1, 2, 3, 4 };
MYSUPERSTRUCT * obj1Objs = {
  { &(obj1Base), 5 },
  { &(obj1Base), 6 },
  { &(obj1Base), 7 },
  NULL
}

オブジェクト名を繰り返し使用することは冗長であることは明らかです。次のように使用できるように、MY_OBJECT_BEGIN 定義の名前をプリプロセッサ変数に保存したいと思います。

MY_OBJECT_BEGIN(obj1, 1, 2, 3, 4)
MY_OBJECT_VALUE(5)
MY_OBJECT_VALUE(6)
MY_OBJECT_VALUE(7)
MY_OBJECT_END()

標準のCプリプロセッサはこれを実現する方法を提供していますか?

4

3 に答える 3

7

標準の C プリプロセッサ変数はありません。Oli Charlesworthが示唆したように、標準の C だけを使用したい場合は、おそらくX-Macrosを使用するのが最善の策です。いくつかのファイルに触れる関連データが本当にたくさんある場合は、次のようなコード ジェネレーターを使用することをお勧めします。 GNU 自動生成.

于 2013-01-25T18:21:02.240 に答える
0

プリプロセッサの定義全体で変数を再利用するために、頭のてっぺんから思いついた最も近い一般的な手法を次に示します。

#include <stdio.h>

#define INIT_VALS(SIZE) unsigned int value[SIZE]; unsigned int i = 0;
#define DEFINE_VAL(NEW_VAL) value[i++] = NEW_VAL;
#define PRINT_VAL(INDEX) printf("%d\n", value[INDEX]);

int main()
{
    INIT_VALS(3)
    DEFINE_VAL(42)
    DEFINE_VAL(70)
    DEFINE_VAL(80)
    PRINT_VAL(0)
    PRINT_VAL(1)
    PRINT_VAL(2)

    // Output:
    // 42
    // 70
    // 80

    return 0;
}

ただし、これを宣伝しているわけではありません。好ましい解決策がないかどうかを慎重に検討してください。:)

于 2013-01-25T18:25:25.263 に答える