[問題] C nested-function

作者: godman362 (蕭青)   2015-03-06 20:27:08
各位先進好,小弟在C上遇到一個關於nested-function的疑惑想請教
以下是jserv大在他的網頁中提到的一份sample code
typedef int (*func_t)(int);
static func_t(int arg) {
int nested(int nested_arg) {
return (arg + nested_arg);
}
return &nested;
}
int main()
{
{
func_t = f(0x1ab);
printf("%d\n", (*g)(20));
}
printf("%d\n", f(400)(27));
printf("%d\n", f(f(400)(27))(20));
return 0;
}
這樣單純傳value的nested-function是沒有問題的
小弟依樣畫葫蘆,做了一個傳function的版本,以下是小弟自己的code
typedef void (*ret_func)(void);
typedef void (*work_func)(void *data);
void show_a(void *data)
{
printf("This is show_a function\n");
}
void show_b(void *data)
{
printf("This is show_b function\n");
}
ret_func func_gen(work_func func)
{
void inside_func(void) {
printf("
作者: carylorrk (carylorrk)   2015-03-06 20:46:00
C 什麼時候可以在 function 裡 define function 了...這看起來比較像是 Python 或 JS 之類的寫法。
作者: littleshan (我要加入劍道社!)   2015-03-06 20:47:00
因為 func_gen 在結束後,stack variable 就消滅了其中包含它的 function pointer 參數這就類似 return address of local variablenested function 在 C 裡面既不是標準,也不好用
作者: carylorrk (carylorrk)   2015-03-06 20:49:00
或是像 C++ lambda 之類的有 closure 的寫法
作者: littleshan (我要加入劍道社!)   2015-03-06 20:50:00
真的想玩 closure 就去玩 C++11 的 lambda 吧
作者: godman362 (蕭青)   2015-03-06 20:57:00
那再請教,為什麼jserv大sample的arg(stack var)卻沒消失呢?因為我在做的project是C,所以才只能用C的解法謝謝提供關於C++ closure的想法,我會去查看看
作者: carylorrk (carylorrk)   2015-03-06 21:26:00
原來還真的有 nested function 的 extension 啊 沒用過
作者: descent (「雄辯是銀,沉默是金」)   2015-03-06 22:21:00
gcc ext 的用法
作者: suhorng ( )   2015-03-06 22:27:00
要參照一下 gnu extension 的文件
作者: carylorrk (carylorrk)   2015-03-06 22:46:00
看了一下,我也想知道 jserv 的寫法是正確的嗎?看起來唯一的差別就是原 PO 沒有加 static,不過這應該不會影響吧?(雖然在我的電腦上加了真的就可以跑了)
作者: NilPtr (神奇的空指標)   2015-03-07 16:30:00
ANIS C沒有套層函數,Clang編譯器跟GCC有提供擴展功能Jserv的程式是對的 但是要用這個GCC自訂功能要加編譯指令-std=gnu11
作者: godman362 (蕭青)   2015-03-07 20:48:00
謝謝各位,我再找一下gcc extension的文件另外,照N大的說法加上後,也是沒辦法動作
作者: NilPtr (神奇的空指標)   2015-03-08 01:55:00
我研究了一會...GCC閉包內的指標跟上一層的指標會不同說錯 是一樣的 但是原本的上層如果不在的話 才會是不同的總之狀態整個很怪 我猜跟函數的Stack空間有關係= =以下測試結果 http://ideone.com/MRgw6L另一個在同作用域呼叫卻很正常 http://ideone.com/0dON2P"西屏 你怎麼看?" "寶傑! 這一定跟外星人有關"
作者: carylorrk (carylorrk)   2015-03-08 04:07:00
我可以放棄嗎?懶得研究非標準的東西XD
作者: godman362 (蕭青)   2015-03-08 08:01:00
謝謝各位,因為我也打算換做法了我在外國的論壇看到多數人對C的nested-function持反對意見,而且也建議不要使用,所以我直接重想做法了

Links booklink

Contact Us: admin [ a t ] ucptt.com