提问人: 提问时间:8/6/2023 最后编辑:Vlad from Moscow 更新时间:8/6/2023 访问量:63
C 函数指针,另一种语法
c function pointer, another syntax
问:
在 C 中,当我们想为以下类型的函数定义函数指针时:
int f(int x, int y);
我们将函数指针变量定义为
int (*fp)(int, int);
我的问题是,C中以下一行是什么意思(没有*),因为gcc,编译它没有错误
int (fp)(int, int);
谢谢
答:
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 );
//^^^^
}
然后,在这种情况下,函数将递归调用自身。
评论