2

我有以下一段我不完全理解的代码:

void (*foo[ABC]) (int *i) {
    [A] = function1,
    [B] = function2,
    [C] = function3
}

其中A和是整数常量BC

ABC1-如果之前没有定义,它是一个有效的声明吗?

2-这种初始化方式叫什么?( [A] = function1;)

3- 的价值是foo[D]多少?它是一个空指针吗?

4

2 回答 2

3
  1. ABC不,如果or A, Bor未定义,它将不起作用C
  2. 初始值设定项就是所谓的指定初始值设定项(对于 C90 是一个 GNU 扩展和 C99 以来的标准,感谢 AndreyT)
  3. 只要D < ABC,foo[D]将是 0(相当于一个NULL-pointer),否则它将是未定义的。

编辑:因为现在的问题是如果和其他索引器是字符串意味着什么,答案要短得多:它没有任何意义,使用字符串作为数组索引是未定义的行为ABCRandom

于 2013-10-27T21:44:29.330 回答
2

“我不认为它是 C”不等同于“它不是 C”。


感谢您的链接,@Kninnug - 这是一个可怕的C99 功能(以及 C90 的 GNU 扩展),并且代码有一个错误:它是三个函数指针数组的拼写错误初始化。我可以想象这样的固定代码:

#define ABC 3

#define A 0
#define B 1
#define C 2

void function1(int *i)
{
}

void function2(int *i)
{
}

void function3(int *i)
{
}

int main(int argc, char *argv[])
{
    void (*foo[ABC]) (int *i) = {
        [A] = function1,
        [B] = function2,
        [C] = function3
    };

    return 0;
}

这编译.

还:

的价值是foo[D]多少?它是一个空指针吗?

嗯,是什么D?如果D >= ABC(假设它们都是非负整数),那么该元素甚至不存在。如果D < ABC,那么它是一个NULL指针,因为聚合(结构、联合和数组)初始化隐式零初始化初始化列表中没有相应初始化表达式的元素。

(更准确地说,它们被初始化“就好像它们具有static存储持续时间一样”,NULL在指针的情况下这是初始化。)

于 2013-10-27T21:49:09.223 回答