【问题标题】:C array of function pointersC 函数指针数组
【发布时间】:2013-10-27 21:34:52
【问题描述】:

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

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

其中ABC 是整数常量。

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

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

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

【问题讨论】:

  • 所有有用的cmets都被埋没了,所以我把它们都去掉了。

标签: c arrays function-pointers


【解决方案1】:
  1. 不,如果未定义 ABCABC,它将不起作用。
  2. 初始化器被称为 designated initializers(对于 C90 是 GNU 扩展和自 C99 以来的标准,感谢 AndreyT)
  3. 只要D < ABCfoo[D]就会为0(相当于一个NULL-指针),否则就是未定义的。

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

【讨论】:

  • 指定初始化器是 C99 以来的 C 语言特性,而不是 GNU 扩展。
  • 如果DABC 是字符串,D < ABC 是什么意思?
  • @Gradient:字符串?那个是从哪里来的?如果这些是字符串,您将无法像在原始帖子中那样使用它们。
  • 我不认为这些是真正的字符串。好像OP不知道“标识符”这个词的存在。
  • 另外,“如果它有自动存储(例如在函数内),那么它的值将是未定义的。” - 否。 聚合初始化要求在初始化列表中没有相应表达式的元素进行零初始化(更准确地说:它们“像具有静态存储持续时间一样被初始化”)。
【解决方案2】:

“I don't think it's C”不等同于“it is not C”。


感谢the link、@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;
}

This compiles.

还有:

foo[D] 的值是多少?是空指针吗?

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

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

【讨论】:

  • 现在[ABC] 改为[RandomWord]
  • 我将我的问题更改为准确地说 A 不是数字。确实是字符串A
  • +1 first 一个评论这个 ugly 语法的人!
  • @hacks 什么样的随机词?显然这应该是一个大小常数,否则就没有意义。
  • @AndreyT 如果数组索引器是字符串,那么整个事情就是未定义的行为,准备hellspawn from your nose
猜你喜欢
  • 2023-04-04
  • 2021-12-07
  • 1970-01-01
  • 2018-04-21
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多