C/C++函數指標聲明,函數指標聲明
前天看APUE,看到signal的聲明居然是
void (*signal(int,void(*)(int)))(int);
初看以下,還真是看不出這是啥意思。道行太淺,只能看到這種函數指標
void *(*func)(int,void(*)(int));
書中說先typedef以下就能看清楚這個指標
typedef void Signfunc(int);
Signfunc *signal(int,Sigfunc *);
這樣寫的確變清晰了,可是搞不懂為啥應該是這麼分析,為啥它不寫成
(void (int))(*signal)(int,void(*)(int));
這麼寫不是更能看懂,然後我放到gcc裡面編譯,它說
error: expected identifier or ‘(’ before ‘void’
(void (int))(*signal)(int,void(*)(int));
改了一下,又說:
error: expected identifier or ‘(’ before ‘int’
void (int)(*signal)(int x,void(*func)(int))
error: ‘signal’ declared as function returning a function
void (*signal)(int,void(*)(int))(int);
error: ‘signal’ declared as function returning a function
void ((*signal)(int,void(*)(int)))(int);
看來它只認這種,真不知老美怎麼想的,搞得這麼難認。
看來只能用這種規則套了:
如果函數返回的不是函數指標,那麼這個函數指標可以定義為如下形式:
test的返回值 ( *test)(test的型參);
如果返回的是函數指標,我們要寫成:
返回函數的返回值 (*test(test的參數))(返回函數的型參);
然後可以組合成各種恐怖的函式宣告
void (*((*signal(int,void(*)(int)))(int,void(*)(int)))(int,void(*)(int));
就是一個函數指標A,它返回的是一個函數指標B,這個B函數是一個返回函數C值針的函數。把複雜的參數先去掉,變成這樣
void (*((*signal(int))(int))(int);
#include <stdio.h>void (*((*signal(int))(int)))(int);void (*fun(int))(int);void test(int);int main(int c, char ** v){signal(323);return 0;}void (*((*signal(int x))(int)))(int){printf("num:%d",x);return fun;}void (*fun(int y))(int){return test;}void test(int x){printf("fuck C function pointer!!!,%d",x);}
我們還可以繼續
就是一個函數指標A,它返回的是一個函數指標B,這個B函數是一個返回函數C值針的函數,而函數C就是一個返回函數D指標的函數。。。。。。
個人部落格地址:http://www.flakor.cn
C語言怎聲明一個返回函數指標的函數?
typedef int (*AA)();
AA function();
C語言的問題:怎申明一個指向任意類型函數的指標?
定義成什麼指標都無所謂,裡面都可以強制轉換。
關鍵是傳進去的函數的參數應該不能是任意的吧。