[問題] C nested-function

看板C_and_CPP (C/C++)作者 (卯)時間10年前 (2015/03/06 20:27), 10年前編輯推噓5(5028)
留言33則, 6人參與, 最新討論串1/1
各位先進好,小弟在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://www.ptt.cc/bbs/C_and_CPP/M.1425644840.A.141.html ※ 編輯: godman362 (106.1.215.164), 03/06/2015 20:39:56

03/06 20:46, , 1F
C 什麼時候可以在 function 裡 define function 了...
03/06 20:46, 1F

03/06 20:46, , 2F
這看起來比較像是 Python 或 JS 之類的寫法。
03/06 20:46, 2F

03/06 20:47, , 3F
因為 func_gen 在結束後,stack variable 就消滅了
03/06 20:47, 3F

03/06 20:48, , 4F
其中包含它的 function pointer 參數
03/06 20:48, 4F

03/06 20:48, , 5F
這就類似 return address of local variable
03/06 20:48, 5F

03/06 20:48, , 6F
nested function 在 C 裡面既不是標準,也不好用
03/06 20:48, 6F

03/06 20:49, , 7F
或是像 C++ lambda 之類的有 closure 的寫法
03/06 20:49, 7F

03/06 20:50, , 8F
真的想玩 closure 就去玩 C++11 的 lambda 吧
03/06 20:50, 8F
※ 編輯: godman362 (106.1.215.164), 03/06/2015 20:54:41 ※ 編輯: godman362 (106.1.215.164), 03/06/2015 20:55:33

03/06 20:57, , 9F
那再請教,為什麼jserv大sample的arg(stack var)卻沒
03/06 20:57, 9F

03/06 20:57, , 10F
消失呢?
03/06 20:57, 10F

03/06 20:58, , 11F
因為我在做的project是C,所以才只能用C的解法
03/06 20:58, 11F

03/06 20:58, , 12F
謝謝提供關於C++ closure的想法,我會去查看看
03/06 20:58, 12F

03/06 21:26, , 13F
原來還真的有 nested function 的 extension 啊 沒用過
03/06 21:26, 13F

03/06 22:21, , 14F
gcc ext 的用法
03/06 22:21, 14F

03/06 22:27, , 15F
要參照一下 gnu extension 的文件
03/06 22:27, 15F

03/06 22:46, , 16F
看了一下,我也想知道 jserv 的寫法是正確的嗎?
03/06 22:46, 16F

03/06 22:47, , 17F
看起來唯一的差別就是原 PO 沒有加 static,不過這應該
03/06 22:47, 17F

03/06 22:47, , 18F
不會影響吧?(雖然在我的電腦上加了真的就可以跑了)
03/06 22:47, 18F

03/07 16:30, , 19F
ANIS C沒有套層函數,Clang編譯器跟GCC有提供擴展功能
03/07 16:30, 19F

03/07 16:40, , 20F
Jserv的程式是對的 但是要用這個GCC自訂功能要加編譯指令
03/07 16:40, 20F

03/07 16:41, , 21F
-std=gnu11
03/07 16:41, 21F

03/07 20:48, , 22F
謝謝各位,我再找一下gcc extension的文件
03/07 20:48, 22F

03/07 20:50, , 23F
另外,照N大的說法加上後,也是沒辦法動作
03/07 20:50, 23F

03/08 01:55, , 24F
我研究了一會...GCC閉包內的指標跟上一層的指標會不同
03/08 01:55, 24F

03/08 01:59, , 25F
說錯 是一樣的 但是原本的上層如果不在的話 才會是不同的
03/08 01:59, 25F

03/08 02:02, , 26F
總之狀態整個很怪 我猜跟函數的Stack空間有關係= =
03/08 02:02, 26F

03/08 02:15, , 27F
以下測試結果 http://ideone.com/MRgw6L
03/08 02:15, 27F

03/08 02:20, , 28F
另一個在同作用域呼叫卻很正常 http://ideone.com/0dON2P
03/08 02:20, 28F

03/08 02:22, , 29F
"西屏 你怎麼看?" "寶傑! 這一定跟外星人有關"
03/08 02:22, 29F

03/08 04:07, , 30F
我可以放棄嗎?懶得研究非標準的東西XD
03/08 04:07, 30F

03/08 08:01, , 31F
謝謝各位,因為我也打算換做法了
03/08 08:01, 31F

03/08 08:02, , 32F
我在外國的論壇看到多數人對C的nested-function持反對
03/08 08:02, 32F

03/08 08:03, , 33F
意見,而且也建議不要使用,所以我直接重想做法了
03/08 08:03, 33F
文章代碼(AID): #1K-Pqe51 (C_and_CPP)
文章代碼(AID): #1K-Pqe51 (C_and_CPP)