函数引用参数:指针vs原型只是样式?

时间:2018-08-14 23:52:04

标签: c parameters reference prototype

可以纯粹声明您可以声明函数引用参数的样式,

int g ( int (*f)(int,int) ) {

int g ( int f(int,int) ) {

以我有限的C经验,我从未见过原型方法。

2 个答案:

答案 0 :(得分:4)

我想它是样式,但是指向函数符号的显式指针符合古老的惯例以及编译器解释代码的方式。

C11 * 标准在§6.7.6.3 Function declarators (including prototypes) ¶8中说:

  

¶8如6.3.2.1中所述,应将参数声明为“函数返回类型”调整为“指向函数返回类型的指针”。

§6.3.2.1 Lvalues, arrays and function designators ¶4说:

  

¶4函数指示符是具有函数类型的表达式。除非它是sizeof运算符,_Alignof运算符, 65)或一元&运算符的操作数,否则其类型为“函数返回”类型”转换为类型为“函数返回类型的指针”的表达式。

     

65)因为不会发生这种转换,所以sizeof_Alignof运算符的操作数仍然是函数指定符,并且违反了6.5.3.4中的约束。 >

因此,使用指针符号可以明确显示编译器将执行的操作。 (尽管(*function_ptr)(arg1, …, argN)也可以用function_ptr(arg1, …, argN)表示法来调用指向函数的显式指针。)


* C18标准是最新的,但尚无便捷的在线HTML版本。通常,两者非常相似。碰巧的是,第6.3.2.1节¶4是一个不同的段落-C18版本没有提到_Alignof

答案 1 :(得分:0)

函数True的名称是指向函数f的指针。即编译器将它们相同地对待。您可以根据自己的问题互换使用这两种形式。

但是,出于完整性考虑,请参见乔纳森·莱夫勒(Jonathan Leffler)最着名的f运算符,_ {sizeof运算符65)和Alignof的例外完整的答案。

您的两个陈述都说: g是返回int的函数,其参数是指向函数f的指针,该函数f返回int,其参数和int,int。