我遇到了以下代码,但我不知道为什么会这样做。有人可以向我解释一下吗?
char *MPIDI_CH3_Pkt_type_to_string[MPIDI_CH3_PKT_END_ALL+1] = {
[MPIDI_CH3_PKT_EAGER_SEND] = "MPIDI_CH3_PKT_EAGER_SEND",
[MPIDI_CH3_PKT_EAGER_SEND_CONTIG] = "MPIDI_CH3_PKT_EAGER_SEND_CONTIG",
};
扎克
答案 0 :(得分:1)
这只是使用指定的初始值设定项,如问题Designated initializers and omitted elements中所示。例如,
const char *foo[42] = {[1] = "hello", [2] = "world"};
问题中给出的代码似乎是一种将常量字符串化的方法。
答案 1 :(得分:1)
你必须声明一个char *
指针数组。你有两个显式常量 - MPIDI_CH3_PKT_EAGER_SEND
和MPIDI_CH3_PKT_EAGER_SEND_CONTIG
- 有一些你不应该“知道”的值。现在,您希望创建索引为MPIDI_CH3_PKT_EAGER_SEND
和MPIDI_CH3_PKT_EAGER_SEND_CONTIG
的元素以指向相应的字符串文字值(并将所有其他数组元素保留为空指针)。
你怎么能这样做?
在C89 / 90中,您可以先将所有内容初始化为空,然后使用赋值将正确的元素设置为正确的值
char *MPIDI_CH3_Pkt_type_to_string[MPIDI_CH3_PKT_END_ALL+1] = { 0 };
MPIDI_CH3_Pkt_type_to_string[MPIDI_CH3_PKT_EAGER_SEND] = "MPIDI_CH3_PKT_EAGER_SEND";
MPIDI_CH3_Pkt_type_to_string[MPIDI_CH3_PKT_EAGER_SEND_CONTIG] = "MPIDI_CH3_PKT_EAGER_SEND_CONTIG";
在C99中,您可以使用设计的初始化程序功能在初始化中执行相同的操作,作为单行程序,这正是您的示例中所做的。
所以,你的“为什么”问题的答案是:因为你的声明中使用的语言功能正是用户想要做的。没有其他答案。
P.S。这里真正的“为什么”问题是他们使用char *
指针指向字符串文字(而不是const char *
指针)的原因。这是一个非常大的“为什么”。