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 回答