C 函数指针,另一种语法

c function pointer, another syntax

提问人: 提问时间:8/6/2023 最后编辑:Vlad from Moscow 更新时间:8/6/2023 访问量:63

问:

在 C 中,当我们想为以下类型的函数定义函数指针时:

int f(int x, int y);

我们将函数指针变量定义为

int (*fp)(int, int);

我的问题是,C中以下一行是什么意思(没有*),因为gcc,编译它没有错误

int (fp)(int, int);

谢谢

C 指针语法 函数声明

评论

0赞 brhans 8/7/2023
看起来像是:stackoverflow.com/questions/76698227/...

答:

0赞 Some programmer dude 8/6/2023 #1
int (fp)(int, int);

是名为 的函数的正向声明fp

它不声明或定义变量。这就像在任何其他名称周围使用括号一样,例如.(x) + (y)

简而言之,它与

int fp(int, int);

评论

0赞 8/6/2023
谢谢,但是是否可以在另一个函数中定义函数的正向声明?(以及是什么意思)。因为我认为当我们在文件的开头(例如在 #includes 之后)声明它们时,它有意义
0赞 Some programmer dude 8/6/2023
@tahzibi 您几乎可以在任何地方进行转发声明。在全局范围内,函数内部,甚至在语句块内部。
0赞 8/6/2023
你能举一个应用的例子,在另一个函数中使用前向函数声明吗?
0赞 Some programmer dude 8/6/2023
@tahzibi 如果需要调用在其他地方(在另一个翻译单元中,或稍后在同一翻译单元中)定义(实现)的函数。
2赞 Vlad from Moscow 8/6/2023 #2

根据 C 语法(C 标准,6.7.6 声明符),声明符可以括在括号中

declarator:
    pointeropt direct-declarator

direct-declarator:
    identifier
    ( declarator )
    //...

所以这个函数声明

int fp(int, int);

也可以写成例如

int (fp)(int, int);

int ( (fp)(int, int) );

通常,程序员将函数名称括在括号中,以防止编译器使用与函数名称同名的宏。

请考虑以下程序。

#include <stdio.h>

#define fp( x ) return x;

int (fp)( int x )
{
    fp( x );
}

int main( void )
{
    printf( "%d\n", ( fp )( 10 ) );
}

程序输出为

10

不将函数名称括在括号中

int fp( int x )
{
    fp( x );
}

编译器会将其视为宏,并发出错误。或者另一方面,如果将函数中的名称括在括号中fp

int (fp)( int x )
{
    ( fp )( x );
    //^^^^
}

然后,在这种情况下,函数将递归调用自身。