【问题标题】:'Return' as a function in an array of function pointers“返回”作为函数指针数组中的函数
【发布时间】:2013-03-06 14:07:28
【问题描述】:

这就是我的工作。

{
    int Test;
    void (*functions[5])() = {
        return,
        one,
        two,
        three,
        four
    };

    for (Test = takeInput(5);; Test = takeInput(5)){
        cls();
        Print(L"0)  Abort\n");
        Print(L"1)  One\n");
        Print(L"2)  Two\n");
        Print(L"3)  Three\n");
        Print(L"4)  Four\n");
        Print(L"Enter Selection: ");
        (*functions[Test])();
    }
}

这就是我想要做的事情的要点。这是某种上下文的菜单系统(并且 takeInput(5) 将暂停输入,停止循环,直到有人输入数字)。

问题在于,以这种方式使用 return 显然是错误的。我认为看到(我认为)return 是一个函数,我不明白为什么不能将它放入函数指针数组中以跳出菜单。我想我可以制作一个在调用时基本上只返回 true 的虚拟函数,并检查它(问题在于所有其他函数都返回 void)。即使这样可行,我也希望有一个与上述不可行的示例一样独立的解决方案。

有没有一种比我想象的更好的、干净、希望简短的方法来做这件事?

【问题讨论】:

  • return 不是函数,是保留字。
  • 我将函数数组中的return 替换为NULL 并在执行函数之前测试null,当函数指针为NULL 时返回。
  • 把它作为一个答案,我会这样标记它。无论如何检查它可能是有意义的,以确保我没有尝试将空指针作为函数调用。我的问题是我看不到如何将函数的索引留空(现在你说了很容易)以便能够跳过它。

标签: c function return function-pointers


【解决方案1】:

return 不是函数,它没有地址,因此您不能将它放在函数指针数组中。

此外,Test 在您前几次使用时显示为未初始化:

for (Test;

(*functions[Test])();

如果您想跳出for 循环,则必须使用breakreturnfor(;condition;) 中两个分号之间的适当条件。

函数调用不会中断循环。除非,它是像 abort()exit()longjmp() 这样的异国情调。

【讨论】:

  • 是的,我刚刚意识到缺少初始化。
【解决方案2】:

我会将函数数组中的return 替换为NULL,并在执行函数之前测试null,当函数指针为NULL 时返回。

【讨论】:

    猜你喜欢
    • 2018-03-07
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 2011-01-12
    • 2021-07-02
    • 2021-06-25
    • 1970-01-01
    • 2012-05-10
    相关资源
    最近更新 更多