C 棘手的数组初始化

C 棘手的数组初始化,c,C,在C(不是C++)中,我试图创建两个字符串表,它们包含相同的值,但以两种不同的方式对值进行排序。我不希望字符串在内存中重复 基本上,我想做以下几点。除了根据gcc,它失败是因为在第二次数组初始化中“initializer元素不是常量”。有办法解决这个问题吗?最好不要说“哦,好吧,编译器应该优化它来做你想要的” 澄清:我知道如何通过循环实现这一点。我正试图弄清楚如何在编译时完成它 另一个更新:我刚编译成C++(g++),它工作。不过,我还是在寻找C答案。这似乎对我很有用: static cons

在C(不是C++)中,我试图创建两个字符串表,它们包含相同的值,但以两种不同的方式对值进行排序。我不希望字符串在内存中重复

基本上,我想做以下几点。除了根据gcc,它失败是因为在第二次数组初始化中“initializer元素不是常量”。有办法解决这个问题吗?最好不要说“哦,好吧,编译器应该优化它来做你想要的”

澄清:我知道如何通过循环实现这一点。我正试图弄清楚如何在编译时完成它


<强>另一个更新:我刚编译成C++(g++),它工作。不过,我还是在寻找C答案。

这似乎对我很有用:

static const char monthNames[][4] = ...
我本以为将指针声明为常量会有所帮助,但正如其他人所指出的,事实并非如此。

示例代码片段:

static const char
    JAN[] = "Jan",
    FEB[] = "Feb",
    // ...
    DEC[] = "Dec";

static const char *const monthNames[] = {
  JAN, FEB, /* ... */ DEC
};

static const char *const monthSortedKeys[]= {
    /* APR, ... */ DEC, /* ... */ FEB, JAN /* ... SEP */
};

哦,编译器应该优化它来做你想做的事情want@K-ballo+1表示幽默。我刚刚测试了这个理论,它确实如此。我想会的。但我希望有一个明确的方法。在一个只有256KB的ROM(和更少的RAM)的系统上,很高兴一眼就知道你的代码没有浪费ROM;我的解决方案可能更具可读性,但…接近。。。。除了它会中断
sizeof()
。这是
静态常量字符*数组[]
静态常量字符数组[][]
之间的一个细微差别。第一个将导致sizeof()返回数组中的指针数。第二个将导致sizeof()返回2D数组的大小。至于为什么这样做而不是原始代码:在Brian的代码中,
monthNames[3]
需要实际计算
*(monthNames+3)
-即从内存中读取值-而在代码中,它相当于
(char*)(monthNames+3)
-无需访问内存,只需一些指针arithmetics@Brian:不应该真的很重要-以下内容仍然有效:
sizeof monthNames/sizeof*monthNames==sizeof monthSortedKeys/sizeof*monthSortedKeys
@Christoph我想这是一个很好的观点,因为我使用了
sizeof()
获取表中字符串的数量。不过,我认为您的答案可能更可取,因为它可以扩展到适用于不同长度的字符串。唯一的缺点是它比需要的要详细一些。我需要类似的东西,但我将字符串数组作为
argv
传递给
main
(以前是
main
,现在它被重命名)函数。
const
限定符将阻止函数原型中的匹配。
static const char
    JAN[] = "Jan",
    FEB[] = "Feb",
    // ...
    DEC[] = "Dec";

static const char *const monthNames[] = {
  JAN, FEB, /* ... */ DEC
};

static const char *const monthSortedKeys[]= {
    /* APR, ... */ DEC, /* ... */ FEB, JAN /* ... SEP */
};