什么是初始化struct数组的最佳解决方案?

时间:2017-06-24 17:35:05

标签: c arrays struct

第一个解决方案:

struct str {
    char *name;
    int flag;
};

enum {
    HELP,
    OUTPUT,
    OTHER
};

typedef struct str table;

table arr[] = {
    { "help", HELP },
    { "output", OUTPUT },
    { NULL, OTHER },
};

int main(int argc, char **argv) {
    table *opt = arr;
    printf("%s\n", (opt+HELP)->name);
    printf("%s\n", (opt+OUTPUT)->name);
    return 0;
}

第二个解决方案:

struct str {
    char *name;
    int flag;
};

enum {
    HELP,
    OUTPUT,
    OTHER
};

typedef struct str table;
table arr[OTHER];

void start_table() {
    arr[HELP] = (struct str) { "help", HELP };
    arr[OUTPUT] = (struct str) { "output", OUTPUT };
    arr[OTHER] = (struct str) { NULL, OTHER };
}

int main(int argc, char **argv) {
    start_table();
    table *opt = arr;
    printf("%s\n", (opt+HELP)->name);
    printf("%s\n", (opt+OUTPUT)->name);
    return 0;
}

最好的是什么?如果我添加或更改数组的任何元素,第二个解决方案会自动更改,但效率如何?是最好的枚举还是使用#define预处理程序指令?

2 个答案:

答案 0 :(得分:1)

取决于!

  • 当可以使用初始化时,使用它 - 所以第一个解决方案通常更好,特别是如果代码永远不会更改结构(数组)内容。
  • 如果您的代码可以更改内容但可能需要能够重置为原始状态,则初始化函数会变得更合适,并且使用直接初始化是不合适的。

没有一个人最好的'解;什么是最好的取决于您需要对阵列做什么。

答案 1 :(得分:0)

使用C99特定的初始化器语法,您可以在静态初始化器中获得第二种方法的优势:

#include <stdio.h>

struct str {
    const char *name;
    int flag;
};

enum {
    HELP,
    OUTPUT,
    OTHER,
};

typedef struct str table;
table arr[] = {
    [HELP]   = { "help", HELP },
    [OUTPUT] = { "output", OUTPUT },
    [OTHER]  = { NULL, OTHER },
};

int main(int argc, char **argv) {
    table *opt = arr;
    printf("%s\n", opt[HELP].name);
    printf("%s\n", opt[OUTPUT].name);
    return 0;
}

这种技术的优点是它不会对枚举值的顺序做出假设,也不会对它们的实际值进行假设,只要它们是正面的,明显的和相当小的。