【发布时间】: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++