我无法在任何地方找到答案。我刚看了K& R,看到他们调用这样的函数指针:
(*ptr)(arg1, arg2);
然而,我清楚地记得曾见过有人像这样使用它们:
ptr(arg1, arg2);
但可能是在C ++中。
答案 0 :(得分:15)
的 TL; DR 强>
C和C ++中的规则是相同的,两者之间没有区别。
C ++标准(n3797)说什么?
5.2.2p1
函数调用[expr.call]
函数调用是后缀表达式,后跟括号 包含一个可能的空的逗号分隔列表 initializer-clause,构成函数的参数。
后缀表达式应具有函数类型或指向函数类型的指针。
C标准(n1570)说什么?
6.3.2.1p4
Lvalues,数组和函数指示符函数指示符是具有函数类型的表达式。除非它是
sizeof
运算符,_Alignof
运算符或一元&
运算符的操作数,函数指示符,类型为"函数返回输入"转换为具有类型"指向函数返回 type " 的表达式。
6.5.2.2p1
函数调用表示被调用函数的表达式应具有指向函数的类型指针返回
void
或返回除数组类型之外的完整对象类型。
<强>结论吗
规则的表达方式在C ++和C之间有所不同。在C中,隐式函数到指针转换在调用函数时总是适用,而C ++表示&#34;后缀表达式&#34; 可以是指针,也可以是函数类型的变量。
然而;你的问题是,如果通过指针调用函数的两种方式在C ++和C之间不同,答案是:不,(1)
,(2)
之间没有区别,和(3)
,两种语言之间也没有区别。
(*fptr)(123); // (1)
fptr(123); // (2)
(***fptr)(123); // (3)
注意:请注意,在调用函数时(*fptr) (...)
和fptr (...)
之间没有区别,但是他们可以在其他情况下会有很大的不同。功能
答案 1 :(得分:3)
规则如何?他们在C和C ++方面有区别吗?
没有。在此上下文中取消引用功能指针从不是必要的,因为它是多余的。
但是,您可能仍希望使用星号表示法强调您通过函数指针调用函数。这也可能是您帖子中代码段作者的原因。