C_and_CPP 板


LINE

各位先進好,小弟在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("---------------\n"); (*func)(NULL); printf("---------------\n"); } return &inside_func; } int main() { ret_func ptr; ptr = func_gen(&show_a); (*ptr)(); return 0; } 以上是小弟的sample,不過卻會直接的Segmentation fault 小弟想做的其實是動態將function再額外用另一個interface包起來 目的是不想讓更外層的人去使用到底層的interface,所以才想說用這種方式 不過並不是很清楚死掉的原因,還請先進給予指點 謝謝 忘了說明,我是在Linux底下使用gcc 4.8.2的結果 -- 當你睜大眼睛卻發現自己什麼都看不見的時候,不要以為是自己瞎了 或許,前方真的一無所有 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 106.1.215.164
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1425644840.A.141.html ※ 編輯: godman362 (106.1.215.164), 03/06/2015 20:39:56
1F:→ carylorrk: C 什麼時候可以在 function 裡 define function 了... 03/06 20:46
2F:→ carylorrk: 這看起來比較像是 Python 或 JS 之類的寫法。 03/06 20:46
3F:→ littleshan: 因為 func_gen 在結束後,stack variable 就消滅了 03/06 20:47
4F:→ littleshan: 其中包含它的 function pointer 參數 03/06 20:48
5F:→ littleshan: 這就類似 return address of local variable 03/06 20:48
6F:→ littleshan: nested function 在 C 裡面既不是標準,也不好用 03/06 20:48
7F:→ carylorrk: 或是像 C++ lambda 之類的有 closure 的寫法 03/06 20:49
8F:→ littleshan: 真的想玩 closure 就去玩 C++11 的 lambda 吧 03/06 20:50
※ 編輯: godman362 (106.1.215.164), 03/06/2015 20:54:41 ※ 編輯: godman362 (106.1.215.164), 03/06/2015 20:55:33
9F:→ godman362: 那再請教,為什麼jserv大sample的arg(stack var)卻沒 03/06 20:57
10F:→ godman362: 消失呢? 03/06 20:57
11F:→ godman362: 因為我在做的project是C,所以才只能用C的解法 03/06 20:58
12F:→ godman362: 謝謝提供關於C++ closure的想法,我會去查看看 03/06 20:58
13F:→ carylorrk: 原來還真的有 nested function 的 extension 啊 沒用過 03/06 21:26
14F:→ descent: gcc ext 的用法 03/06 22:21
15F:推 suhorng: 要參照一下 gnu extension 的文件 03/06 22:27
16F:→ carylorrk: 看了一下,我也想知道 jserv 的寫法是正確的嗎? 03/06 22:46
17F:→ carylorrk: 看起來唯一的差別就是原 PO 沒有加 static,不過這應該 03/06 22:47
18F:→ carylorrk: 不會影響吧?(雖然在我的電腦上加了真的就可以跑了) 03/06 22:47
19F:推 NilPtr: ANIS C沒有套層函數,Clang編譯器跟GCC有提供擴展功能 03/07 16:30
20F:推 NilPtr: Jserv的程式是對的 但是要用這個GCC自訂功能要加編譯指令 03/07 16:40
21F:→ NilPtr: -std=gnu11 03/07 16:41
22F:→ godman362: 謝謝各位,我再找一下gcc extension的文件 03/07 20:48
23F:→ godman362: 另外,照N大的說法加上後,也是沒辦法動作 03/07 20:50
24F:推 NilPtr: 我研究了一會...GCC閉包內的指標跟上一層的指標會不同 03/08 01:55
25F:推 NilPtr: 說錯 是一樣的 但是原本的上層如果不在的話 才會是不同的 03/08 01:59
26F:→ NilPtr: 總之狀態整個很怪 我猜跟函數的Stack空間有關係= = 03/08 02:02
27F:→ NilPtr: 以下測試結果 http://ideone.com/MRgw6L 03/08 02:15
28F:→ NilPtr: 另一個在同作用域呼叫卻很正常 http://ideone.com/0dON2P 03/08 02:20
29F:→ NilPtr: "西屏 你怎麼看?" "寶傑! 這一定跟外星人有關" 03/08 02:22
30F:→ carylorrk: 我可以放棄嗎?懶得研究非標準的東西XD 03/08 04:07
31F:→ godman362: 謝謝各位,因為我也打算換做法了 03/08 08:01
32F:→ godman362: 我在外國的論壇看到多數人對C的nested-function持反對 03/08 08:02
33F:→ godman362: 意見,而且也建議不要使用,所以我直接重想做法了 03/08 08:03







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BuyTogether站內搜尋

TOP