2

extern "C" {
    typedef struct Pair_s {
        char *first;
        char *second;
    } Pair;

    typedef struct PairOfPairs_s {
        Pair *first;
        Pair *second;
    } PairOfPairs;
}

Pair pairs[] = {
    {"foo", "bar"}, //this is fine
    {"bar", "baz"}
}; 

PairOfPairs pops[] = {
    {{"foo", "bar"}, {"bar", "baz"}}, //How can i create an equivalent of this NEATLY
    {&pairs[0], &pairs[1]} //this is not considered neat (imagine trying to read a list of 30 of these)
}; 

上記のスタイル宣言セマンティクスをどのように実現できますか?

4

2 に答える 2

5

C++11 では、次のように記述できます。

PairOfPairs pops[] = {
    { new Pair{"a", "A"}, new Pair{"b", "B"} },
    { new Pair{"c", "C"}, new Pair{"d", "D"} },
    // the grouping braces are optional
};

フリー ストアを使用することの意味に注意してください。そこに割り当てられたオブジェクトは、プログラムの実行の最後 (静的オブジェクトのように) またはそれ以外 (対応する なし) で破棄されませんdelete。Pair が C 構造体であり、リソースを管理しない場合 (そして、プログラムが終了するまでそのメモリを使用することを常に期待していた場合) は、おそらくホストされた実装では問題になりません。

編集: C++11 の機能を使用できない場合は、いつでもヘルパー関数を作成できます。例:

static Pair* new_pair(const char* first, const char* second)
{
    Pair* pair = new Pair;
    pair->first = first;
    pair->second = second;
    return pair;
}
于 2012-06-04T23:14:39.990 に答える
2

これは、マクロがコードの可読性を向上させると私が考えるケースです。保護されていないインクルード ファイルを作成できます。

/* file: pairs.def */
PAIR_DEF(foo, bar)
PAIR_DEF(bar, baz)
//...

配列を初期化するときは、次のpairsファイルを使用します。

Pair pairs[] = {
#define PAIR_DEF(x, y) { #x, #y },
#include "pairs.def"
#undef PAIR_DEF
};

また、対応する列挙定数を作成できます。

enum PairEnum {
#define PAIR_DEF(x, y) PAIR_ ## x ## _ ## y,
#include "pairs.def"
#undef PAIR_DEF
};

pops次に、アレイの初期化に役立つヘルパー マクロを作成します。

#define PAIR(x, y) &pairs[PAIR_ ## x ## _ ## y]
PairOfPairs pops[] = {
    { PAIR(foo, bar), PAIR(bar, baz) },
    //...
};

これは、この質問enumへの回答で説明されている、値を文字列に関連付けるために使用する手法に似ています。

于 2012-06-04T23:30:13.803 に答える