【问题标题】:Why there are two ways to call function by pointer? [duplicate]为什么有两种方法可以通过指针调用函数? [复制]
【发布时间】:2016-09-21 10:29:45
【问题描述】:

在我正在使用的项目中,我发现了一个复杂的宏,它正在创建一个指向从共享库加载的函数的指针映射。要将它用于另一个应该以相同方式加载的库,我必须检查它..并发现它包含据我所知不应该工作的行。为了把它归结为简单的代码,我扔掉了所有的语法糖,做了这样的例子:

#include <iostream>

using namespace std;

void func(int i, float f)
{
    cout << "Parameter is " << i << " and " << f  << endl;
}


typedef void (*FunctionFunc)(int i, float f);

int _tmain(int argc, _TCHAR* argv[])
{
    FunctionFunc p = &func;
    (p)(5,4.3f);
    return 0;
}

根据 K&R 以来的书籍,函数调用不应该像 (*p)(5,4.3f) 吗?编译器是 VS2010,上面的代码可以带星号和不带星号。

【问题讨论】:

  • 你可能想看看this
  • @user3286661:这是反向转换。
  • @MSalters 该问题的公认答案是该问题的一个很好的答案。
  • 嗯,这是不可能的,因为那个问题是我的问题的答案,哈哈。作者询问了同一悖论的完全不同的表现。我不能说我责怪新的标准或者我讨厌 C++,但是通过将特性堆积到标准中,它们引起了一些问题。
  • 有趣的事实:函数调用运算符()总是对函数指针进行操作。当您编写(*p)() 时,指针被取消引用,然后立即再次取消引用,以便函数调用运算符得到它想要的。 (C99 §§ 6.3.2p4 和 6.5.2.2p1)

标签: c++ c function pointers visual-c++


【解决方案1】:

不,取消引用不是必需的。指向函数的指针是可调用的,就像函数一样。即使是p(5, 4.3f) 也是可以接受的。

【讨论】:

    猜你喜欢
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    相关资源
    最近更新 更多