0

私は.cファイルに次のものを持っています(これは例証するためのはるかに小さい配列です):

static const char* __someNames[] =
{
    "Fox",
    "Wulf",
    "Cat"
};

その後、次のようなマクロを定義しています。

#define EXAMPLE(N) XXX

XXX を..ie__someNames[N]なしで置き換えたいところ"

#define EXAMPLE(1)

展開する:

Wulf

これについてどうすればよいですか?

編集

いくつかのクールなアイデア。これは、私がこれをやりたいという知的好奇心からです。再定義されたマクロで #include "file.h# を 2 回使用するというアイデアが気に入っています。ブースト プリプロセッサも使用できるとしたらどうすればよいでしょうか (質問に c++ とブースト タグを追加しました)。 "file.h"? 文字列ごとに #define を持つものもクールですが、#define の数を考えると少し考えが少なくなります...

4

3 に答える 3

7

Xの問題(Yの解決策について尋ねたところ)の解決策は、物事を好転させ、マクロを使用して文字列を挿入し、再定義された同じマクロを使用して、他のやりたいことを行うことだと思います.

例えば:

#define EXAMPLE(x)   #x,

static const char* __someNames[] =
{

#include "file.h"
};

#undef EXAMPLE
#define EXAMPLE(x)   x,

enum animals 
{
#include "file.h"
};

file.h の内容は次のとおりです。

EXAMPLE(Fox)
EXAMPLE(Wulf)
EXAMPLE(Cat)
于 2013-02-14T22:51:28.163 に答える
3

標準の C または C++ プリプロセッサでこれを行う方法はありません。

プリプロセッサはコードをスキャンして識別子を探し、識別子がマクロと一致する場合、マクロを展開します。この場合、展開されたマクロは、実際には配列名の後に括弧で囲まれた入力番号が続きます。

これは、プリプロセッサの動作方法の制限です!

回避策は次のとおりです...

#define EXAMPLE_1  Wolf
#define EXAMPLE_2  Dog
#define EXAMPLE_3  Cat

#define EXAMPLE_X(n) EXAMPLE_##n

// Then say 

EXAMPLE_X(1); // will put Wolf;

int EXAMPLE_X(2) = 0;// expands to int Dog = 0;

残念ながら、それは定数を渡した場合にのみ機能します。変数は機能し1ませ2ん。

また ...

static const char* __someNames[] =
{
    #define __someNames_1 Fox
    "Fox",
    #define __someNames_2 Wulf
    "Wulf",
    #define __someNames_3 Cat
    "Cat"
};    


#define EXAMPLE_X(n) __someNames_##n

これは期待どおりに機能し、同じスキームを維持しますが、大きな配列に対して多くの定義が必要になります!.

于 2013-02-14T22:49:11.730 に答える
-1
 #define EXAMPLE(_x)  __someNames[(_x)]
于 2013-02-14T22:46:24.803 に答える