- 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”声明嵌套函数总是会产生错误。
广告