带有括号的typedef如"typedef int(f)(void)"是什么意思?它是功能原型吗?

Hem*_*nth 28 c typedef

typedef int (fc_name) (void);
Run Code Online (Sandbox Code Playgroud)

fc_name是任何有效的C符号.

这与函数指针typedef有何不同?

jam*_*lin 34

这是一个typedef函数类型.目的是将它用于函数指针,但在这种情况下,使用它的语法是:

int bar(void);

fc_name* foo = bar; /* Note the * */
Run Code Online (Sandbox Code Playgroud)

更新:正如对Jonathan Leffler的回答所述,typedef可以用来声明函数.一种用途可能是声明一组回调函数:

typedef int (callback)(int, void*);

callback onFoo;
callback onBar;
callback onBaz;
callback onQux;
Run Code Online (Sandbox Code Playgroud)


Jon*_*ler 17

第一个括号是多余的 - 它相当于:

typedef int fc_name(void);
Run Code Online (Sandbox Code Playgroud)

我不认为这有用,但我不能让GCC自己抱怨它.

这意味着它fc_name是一个函数类型的别名,它不带参数并返回一个int.虽然你可以rand()使用以下函数声明函数,但它并非直接有用.

fc_name rand;
Run Code Online (Sandbox Code Playgroud)

您不能typedef在函数定义中使用它.

函数typedef的指针如下:

typedef int (*fc_name)(void);
Run Code Online (Sandbox Code Playgroud)

此代码显示没有星号的typedef不是函数指针(解决现在删除的替代答案):

static int function(void)
{
    return 0;
}

typedef int   fc_name1 (void);
typedef int  (fc_name2)(void);
typedef int (*fc_name3)(void);

fc_name1 x = function;
fc_name2 y = function;
fc_name3 z = function;
Run Code Online (Sandbox Code Playgroud)

编译时,'gcc'说:

gcc -Wextra -Wall -pedantic -c -O x.c
x.c:10:1: error: function ‘x’ is initialized like a variable
x.c:11:1: error: function ‘y’ is initialized like a variable
Run Code Online (Sandbox Code Playgroud)

这段代码证明你确实可以fc_name *var = funcname;按照jamesdlin的建议使用:

static int function(void)
{
    return 0;
}

typedef int   fc_name1 (void);
typedef int  (fc_name2)(void);
typedef int (*fc_name3)(void);

fc_name1  x_0 = function;
fc_name1 *x_1 = function;
fc_name2  y_0 = function;    // Damn Bessel functions - and no <math.h>
fc_name2 *y_1 = function;    // Damn Bessel functions - and no <math.h>
fc_name3  z   = function;
Run Code Online (Sandbox Code Playgroud)

使用y0,y1生成GCC警告:

x.c:12:11: warning: conflicting types for built-in function ‘y0’
x.c:13:11: warning: built-in function ‘y1’ declared as non-function
Run Code Online (Sandbox Code Playgroud)

并且,根据schot的评论:

static int function(void)
{
    return 0;
}

typedef int   fc_name1 (void);
typedef int  (fc_name2)(void);
typedef int (*fc_name3)(void);

fc_name1  x_0 = function;   // Error
fc_name1 *x_1 = function;   // x_1 is a pointer to function
fc_name1  x_2;              // Declare int x_2(void);
fc_name1 *x_3 = x_2;        // Declare x_3 initialized with x_2

fc_name2  y_0 = function;   // Damn Bessel functions - and no <math.h>
fc_name2 *y_1 = function;   // Damn Bessel functions - and no <math.h>
fc_name1  y_2;              // Declare int y_2(void);
fc_name1 *y_3 = x_2;        // Declare y_3 initialized with y_2

fc_name3  z   = function;
Run Code Online (Sandbox Code Playgroud)

有趣的是 - C的黑暗角落确实是黑暗的.

  • 您还可以使用函数`typedef`作为函数*声明*(原型),但不能用于*定义*.但除了混淆之外,这不是很有用. (5认同)