调用函数指针时,星号是否可选?

时间:2014-05-30 17:39:03

标签: c++ c function-pointers language-lawyer

我无法在任何地方找到答案。我刚看了K& R,看到他们调用这样的函数指针:

(*ptr)(arg1, arg2);

然而,我清楚地记得曾见过有人像这样使用它们:

ptr(arg1, arg2);

但可能是在C ++中。

  • 规则如何?
  • 他们在C和C ++方面有区别吗?

2 个答案:

答案 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 ++方面有区别吗?

没有。在此上下文中取消引用功能指针从不是必要的,因为它是多余的。

但是,您可能仍希望使用星号表示法强调您通过函数指针调用函数。这也可能是您帖子中代码段作者的原因。