Первые круглые скобки излишни - это эквивалентно:
typedef int fc_name(void);
Я не думаю, что это делает что-то полезное, хотя я не могу заставить GCC жаловаться на это самостоятельно.
Это означает, что fc_name
является псевдонимом для типа функции, который не принимает аргументов и возвращает int
.Это не так уж и полезно, хотя вы можете объявить, например, функцию rand()
, используя:
fc_name rand;
Вы не можете использовать typedef
в определении функции.
Указатель на функцию typedef будет выглядеть следующим образом:
typedef int (*fc_name)(void);
Этот код показывает, что 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;
При компиляции '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
И этот код демонстрирует, что вы действительно можете использовать 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;
Используя 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
И, основываясь на комментарии от 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;
Интересно- темные углы Си действительно мрачны.