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