解析 C 声明
Parsing C declarations
谁能帮我弄清楚这个声明?
int *x()(int)
void (*signal(int, void (*fp)(int)))(int)
我似乎无法使用给定的方法解析这些 here 。我知道 what 这意味着使用 cdecl.org 并且第一个是非法的,但我想弄清楚 how 来解析这些?
当函数 return 的函数指针时, return 值包围函数名称及其参数。所以从中心开始是有帮助的。
但是解析函数指针语法的最佳方法是根本不必解析它。
第二个例子可以用typedef
写成:
typedef void funType(int); // Our function type
funType * signal(int i, funType * fp); // Sane version of the function declaration
当你需要使用函数指针时,总是先用typedef
定义函数类型。
首先,一些基本规则:
T *a[N]; // a is an array of pointer to T
T (*a)[N]; // a is a pointer to an array of T
T *f(); // f is a function returning a pointer to T
T (*f)(); // f is a pointer to a function returning T
const T *p; // p is a non-const pointer to const T
T const *p; // same as above
T * const p; // p is a const pointer to non-const T
在声明符和表达式中,[]
和 ()
运算符的优先级高于 *
运算符,因此在使用指针时需要明确地将其与标识符分组数组 ((*a)[N]
) 和函数指针 ((*f)()
)。
当你发现一个毛茸茸的声明时,找到最左边的标识符并找出路,记住上面的规则,并将它们递归地应用于任何函数参数:
signal -- signal
signal( ) -- is a function taking
signal( ) -- parameter unnamed
signal(int, ) -- of type int
signal(int, fp ) -- parameter fp
signal(int, (*fp) ) -- is a pointer
signal(int, (*fp)( )) -- to a function taking
signal(int, (*fp)( )) -- parameter unnamed
signal(int, (*fp)(int)) -- of type int
signal(int, void (*fp)(int)) -- returning void
(*signal(int, void (*fp)(int))) -- returning a pointer
(*signal(int, void (*fp)(int)))( ) -- to a function taking
(*signal(int, void (*fp)(int)))( ) -- parameter unnamed
(*signal(int, void (*fp)(int)))(int) -- of type int
void (*signal(int, void (*fp)(int)))(int); -- returning void
在英语中,signal
是一个函数,它接受一个整数和一个指向信号函数的指针作为参数,returns一个指向处理函数的指针。
有时您没有标识符(例如在仅指定类型的函数原型中),因此您必须在心里放入一个占位符(称为 λ)并将规则应用于该占位符:
void (*signal(int λ, void (*fp)(int λ)))(int λ);
谁能帮我弄清楚这个声明?
int *x()(int)
void (*signal(int, void (*fp)(int)))(int)
我似乎无法使用给定的方法解析这些 here 。我知道 what 这意味着使用 cdecl.org 并且第一个是非法的,但我想弄清楚 how 来解析这些?
当函数 return 的函数指针时, return 值包围函数名称及其参数。所以从中心开始是有帮助的。
但是解析函数指针语法的最佳方法是根本不必解析它。
第二个例子可以用typedef
写成:
typedef void funType(int); // Our function type
funType * signal(int i, funType * fp); // Sane version of the function declaration
当你需要使用函数指针时,总是先用typedef
定义函数类型。
首先,一些基本规则:
T *a[N]; // a is an array of pointer to T
T (*a)[N]; // a is a pointer to an array of T
T *f(); // f is a function returning a pointer to T
T (*f)(); // f is a pointer to a function returning T
const T *p; // p is a non-const pointer to const T
T const *p; // same as above
T * const p; // p is a const pointer to non-const T
在声明符和表达式中,[]
和 ()
运算符的优先级高于 *
运算符,因此在使用指针时需要明确地将其与标识符分组数组 ((*a)[N]
) 和函数指针 ((*f)()
)。
当你发现一个毛茸茸的声明时,找到最左边的标识符并找出路,记住上面的规则,并将它们递归地应用于任何函数参数:
signal -- signal
signal( ) -- is a function taking
signal( ) -- parameter unnamed
signal(int, ) -- of type int
signal(int, fp ) -- parameter fp
signal(int, (*fp) ) -- is a pointer
signal(int, (*fp)( )) -- to a function taking
signal(int, (*fp)( )) -- parameter unnamed
signal(int, (*fp)(int)) -- of type int
signal(int, void (*fp)(int)) -- returning void
(*signal(int, void (*fp)(int))) -- returning a pointer
(*signal(int, void (*fp)(int)))( ) -- to a function taking
(*signal(int, void (*fp)(int)))( ) -- parameter unnamed
(*signal(int, void (*fp)(int)))(int) -- of type int
void (*signal(int, void (*fp)(int)))(int); -- returning void
在英语中,signal
是一个函数,它接受一个整数和一个指向信号函数的指针作为参数,returns一个指向处理函数的指针。
有时您没有标识符(例如在仅指定类型的函数原型中),因此您必须在心里放入一个占位符(称为 λ)并将规则应用于该占位符:
void (*signal(int λ, void (*fp)(int λ)))(int λ);