1. C语言基础
1.1 const
修饰变量
只可访问,不可重新赋值。
const int MAX_VALUE = 100;
void printValue(const int value);
修饰指针
- 限制指向位置
const int *ptr;
- 限制指向数据
const int *const ptr;
1.2 static
静态变量
使用 static 关键字声明静态变量时,变量的生命周期会延长到整个程序运行期间,而不仅仅局限在其定义的作用域内。静态变量在第一次被赋值时初始化,并且保留其值直到程序结束。
静态全局变量
使用 static 关键字在全局作用域中声明的变量具有静态存储持续时间,但是其作用域被限制在声明该变量的源文件内。这使得该变量对其他源文件不可见,可以防止命名冲突。
静态函数
使用 static 关键字声明静态函数时,该函数仅在声明所在的源文件中可见,即它具有内部链接性。静态函数的作用域仅限于声明所在的源文件。这种方式可以避免与其他源文件中的同名函数产生冲突。
1.3 回调函数的用法
用于在函数执行过程中调用另一个函数。回调函数允许我们向一个函数传递另一个函数的地址,从而在需要时执行特定的操作。回调函数通常用于事件处理、异步编程、库函数的扩展等场景。
- 定义回调函数
首先定义一个函数作为回调函数,其函数原型应与回调的要求相匹配。例如:
void callbackFunction(int result) {
printf("Callback result: %d\n", result);
}
- 在函数中注册回调函数
在需要的地方将回调函数注册进目标函数中,通常通过函数指针实现。例如:
void performOperation(void (*callback)(int)) {
int result = 100; // 模拟操作结果
// 执行操作...
// 调用回调函数
callback(result);
}
- 调用包含回调函数的函数
最后调用包含回调函数的函数,将回调函数的地址传递给要调用的函数。例如:
int main() {
performOperation(callbackFunction); // 注册回调函数
return 0;
}
在这个示例中,performOperation 函数执行某个操作后调用了注册的回调函数 callbackFunction,并将结果传递给回调函数进行处理。
通过回调函数,我们可以实现灵活的程序设计,允许函数根据不同情况来调用不同的操作,增加了程序的可扩展性和可重用性。当需要在函数执行过程中动态切换功能时,回调函数是一个非常有用的工具。
使用回调函数有以下一些好处:
- 灵活性和可扩展性
回调函数提供了一种灵活的机制,使得代码可以在不同的场景中进行定制和扩展。通过将特定的功能封装在回调函数中,可以根据需要动态地更改或添加行为,而无需修改主函数的逻辑。 - 解耦和模块化
回调函数有助于将不同的功能模块分离,使代码更具有模块化和可维护性。主函数可以专注于其核心逻辑,而将特定的任务委托给回调函数来处理。这样可以提高代码的可读性和可重用性。 - 异步处理和事件驱动
回调函数常用于异步操作或事件驱动的场景中。例如,在异步 I/O 操作完成或特定事件发生时,可以通过回调函数来处理相应的逻辑。这有助于提高程序的并发性和响应性。 - 定制性和扩展性
回调函数允许用户提供自己的自定义逻辑,以满足特定的需求。这使得程序可以更好地适应各种不同的用例和业务逻辑。 - 代码复用
回调函数可以作为可复用的模块,在多个地方被调用,从而减少代码冗余。
需要注意的是,在使用回调函数时,要确保正确处理回调函数的参数和返回值,并注意线程安全等问题。合理使用回调函数可以提高代码的灵活性和扩展性,但也需要谨慎设计和管理,以避免引入复杂度过高或难以调试的问题。
1.4 宏定义
在 C 语言中,宏定义是一种预处理器指令,用于在编译阶段进行文本替换。它允许你定义一个标识符(通常是一个宏名),并将其与一个特定的文本表达式或代码块关联起来。当在代码中使用该宏名时,编译器会将其替换为相应的文本。
宏定义的常见用法和好处包括:
- 常量定义
使用宏定义可以创建常量,例如定义一些具有特定值的常量,以增强代码的可读性和可维护性。 - 代码简化和抽象
宏定义可以用于简化复杂的表达式或代码块,使其更易于阅读和理解。例如,将常用的计算或操作封装在宏中,以便在多个地方重复使用。 - 条件编译
通过宏定义可以实现条