
- C程式設計教程
- C語言 - 首頁
- C語言基礎
- C語言 - 概述
- C語言 - 特性
- C語言 - 歷史
- C語言 - 環境搭建
- C語言 - 程式結構
- C語言 - Hello World
- C語言 - 編譯過程
- C語言 - 註釋
- C語言 - 詞法單元
- C語言 - 關鍵字
- C語言 - 識別符號
- C語言 - 使用者輸入
- C語言 - 基本語法
- C語言 - 資料型別
- C語言 - 變數
- C語言 - 整數提升
- C語言 - 型別轉換
- C語言 - 型別強制轉換
- C語言 - 布林值
- C語言中的常量和字面量
- C語言 - 常量
- C語言 - 字面量
- C語言 - 轉義序列
- C語言 - 格式說明符
- C語言中的運算子
- C語言 - 運算子
- C語言 - 算術運算子
- C語言 - 關係運算符
- C語言 - 邏輯運算子
- C語言 - 位運算子
- C語言 - 賦值運算子
- C語言 - 一元運算子
- C語言 - 自增和自減運算子
- C語言 - 三元運算子
- C語言 - sizeof 運算子
- C語言 - 運算子優先順序
- C語言 - 其他運算子
- C語言中的決策語句
- C語言 - 決策語句
- C語言 - if 語句
- C語言 - if...else 語句
- C語言 - 巢狀 if 語句
- C語言 - switch 語句
- C語言 - 巢狀 switch 語句
- C語言中的迴圈
- C語言 - 迴圈
- C語言 - while 迴圈
- C語言 - for 迴圈
- C語言 - do...while 迴圈
- C語言 - 巢狀迴圈
- C語言 - 死迴圈
- C語言 - break 語句
- C語言 - continue 語句
- C語言 - goto 語句
- C語言中的函式
- C語言 - 函式
- C語言 - 主函式
- C語言 - 按值呼叫函式
- C語言 - 按引用呼叫函式
- C語言 - 巢狀函式
- C語言 - 可變引數函式
- C語言 - 使用者自定義函式
- C語言 - 回撥函式
- C語言 - 返回語句
- C語言 - 遞迴
- C語言中的作用域規則
- C語言 - 作用域規則
- C語言 - 靜態變數
- C語言 - 全域性變數
- C語言中的陣列
- C語言 - 陣列
- C語言 - 陣列的特性
- C語言 - 多維陣列
- C語言 - 向函式傳遞陣列
- C語言 - 從函式返回陣列
- C語言 - 變長陣列
- C語言中的指標
- C語言 - 指標
- C語言 - 指標和陣列
- C語言 - 指標的應用
- C語言 - 指標運算
- C語言 - 指標陣列
- C語言 - 指向指標的指標
- C語言 - 向函式傳遞指標
- C語言 - 從函式返回指標
- C語言 - 函式指標
- C語言 - 指向陣列的指標
- C語言 - 指向結構體的指標
- C語言 - 指標鏈
- C語言 - 指標與陣列的比較
- C語言 - 字元指標和函式
- C語言 - 空指標
- C語言 - void 指標
- C語言 - 野指標
- C語言 - 解引用指標
- C語言 - 近指標、遠指標和巨型指標
- C語言 - 指標陣列的初始化
- C語言 - 指標與多維陣列的比較
- C語言中的字串
- C語言 - 字串
- C語言 - 字串陣列
- C語言 - 特殊字元
- C語言中的結構體和聯合體
- C語言 - 結構體
- C語言 - 結構體和函式
- C語言 - 結構體陣列
- C語言 - 自引用結構體
- C語言 - 查詢表
- C語言 - 點(.)運算子
- C語言 - 列舉(enum)
- C語言 - 結構體填充和打包
- C語言 - 巢狀結構體
- C語言 - 匿名結構體和聯合體
- C語言 - 聯合體
- C語言 - 位域
- C語言 - typedef
- C語言中的檔案處理
- C語言 - 輸入與輸出
- C語言 - 檔案I/O (檔案處理)
- C語言預處理器
- C語言 - 預處理器
- C語言 - 編譯指示
- C語言 - 預處理器運算子
- C語言 - 宏
- C語言 - 標頭檔案
- C語言中的記憶體管理
- C語言 - 記憶體管理
- C語言 - 記憶體地址
- C語言 - 儲存類別
- 其他主題
- C語言 - 錯誤處理
- C語言 - 可變引數
- C語言 - 命令執行
- C語言 - 數學函式
- C語言 - static關鍵字
- C語言 - 隨機數生成
- C語言 - 命令列引數
- C程式設計資源
- C語言 - 問答
- C語言 - 快速指南
- C語言 - 速查表
- C語言 - 有用資源
- C語言 - 討論
C語言巢狀函式
在程式設計領域,“巢狀”指的是將某個程式設計元素包含在另一個類似的元素中。就像巢狀迴圈、巢狀結構體等一樣,巢狀函式是指在一個函式內部使用一個或多個函式。
什麼是詞法作用域?
在C語言中,不允許在一個函式內部定義另一個函式。簡而言之,C語言不支援巢狀函式。函式只能在另一個函式內部進行宣告(不能定義)。
當一個函式在另一個函式內部宣告時,這被稱為詞法作用域。詞法作用域在C語言中是無效的,因為編譯器無法找到內部函式的正確記憶體位置。
巢狀函式用途有限
巢狀函式定義無法訪問周圍塊的區域性變數。它們只能訪問全域性變數。在C語言中,存在兩種巢狀作用域:區域性作用域和全域性作用域。因此,巢狀函式的用途有限。
示例:巢狀函式
如果你想建立一個如下所示的巢狀函式,則會產生錯誤:
#include <stdio.h> int main(void){ printf("Main Function"); int my_fun(){ printf("my_fun function"); // Nested Function int nested(){ printf("This is a nested function."); } } nested(); }
輸出
執行這段程式碼時,你會得到一個錯誤:
main.c:(.text+0x3d): undefined reference to `nested' collect2: error: ld returned 1 exit status
巢狀函式的跳板
“GNU C”中巢狀函式作為擴充套件功能受支援。GCC 使用一種稱為跳板的技術來實現獲取巢狀函式的地址。
跳板是在執行時建立的一段程式碼,用於獲取巢狀函式的地址。它需要在宣告中使用關鍵字auto作為函式字首。
示例1
請看下面的例子:
#include <stdio.h> int main(){ auto int nested(); nested(); printf("In Main Function now\n"); int nested(){ printf("In the nested function now\n"); } printf("End of the program"); }
輸出
執行這段程式碼後,將會產生以下輸出:
In the nested function now In Main Function now End of the program
示例2
在這個程式中,函式square()巢狀在另一個函式myfunction()內部。巢狀函式用auto關鍵字宣告。
#include <stdio.h> #include <math.h> double myfunction (double a, double b); int main(){ double x = 4, y = 5; printf("Addition of squares of %f and %f = %f", x, y, myfunction(x, y)); return 0; } double myfunction (double a, double b){ auto double square (double c) { return pow(c,2); } return square (a) + square (b); }
輸出
執行程式碼並檢查其輸出:
Addition of squares of 4.000000 and 5.000000 = 41.000000
巢狀函式:需要注意的幾點
使用巢狀函式時,需要注意以下幾點:
- 巢狀函式可以訪問包含函式中在其定義之前的所有識別符號。
- 巢狀函式必須在包含函式退出之前呼叫。
- 巢狀函式不能使用goto語句跳轉到包含函式中的標籤。
- 巢狀函式定義允許在任何塊的函式中,與塊中的其他宣告和語句混合使用。
- 如果嘗試在包含函式退出後透過其地址呼叫巢狀函式,則會引發錯誤。
- 巢狀函式始終沒有連結性。“extern”或“static”宣告巢狀函式總是會產生錯誤。
廣告