如何在C++中声明带有已填充信息的指针

How can I declare a pointer with filled information in C++?

本文关键字:填充 信息 指针 C++ 声明      更新时间:2023-10-16

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)
}; 

如何实现上述样式声明语义?

在 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;
}

在这种情况下,我认为宏会增加代码的可读性。您可以创建一个不受保护的包含文件:

/* 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值与字符串相关联的技术,如我对此问题的回答中所述。