(编写中)模块化编程与包管理
条件编译
- 在很多情况下,我们希望程序的其中一部分代码只有在满足一定条件时才进行编译,否则不参与编译(只有参与编译的代码最终才能被执行),这就是条件编译。
- 为什么要使用条件编译
- 1)按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。有利于程序的移植和调试。
- 2)条件编译当然也可以用条件语句来实现。 但是用条件语句将会对整个源程序进行编译,生成 的目标代码程序很长,而采用条件编译,则根据条件只编译其中的程 序段 1 或程序段 2,生成的目 标程序较短。 ##if-#else 条件编译指令
- 第一种格式:
- 它的功能是,如常量表达式的值为真(非 0),则将 code1 编译到程序中,否则对 code2 编译到程序中。
- 注意:
- 是将代码编译进可执行程序, 而不是执行代码
- 条件编译后面的条件表达式中不能识别变量,它里面只能识别常量和宏定义
#if 常量表达式
..code1...
#else
..code2...
#endif
#define SCORE 67
#if SCORE > 90
printf("优秀\n");
#else
printf("不及格\n");
#endif
- 第二种格式:
#if 条件1
...code1...
#elif 条件2
...code2...
#else
...code3...
#endif
#define SCORE 67
#if SCORE > 90
printf("优秀\n");
#elif SCORE > 60
printf("良好\n");
#else
printf("不及格\n");
#endif
模块化编程基础
为什么需要模块化编程?
随着程序规模的增长,将所有代码写在一个文件中会导致:
- 代码难以维护
- 功能耦合严重
- 团队协作困难
- 代码复用性差
模块化编程通过将功能拆分到不同的文件中,提高了代码的:
- 可维护性 - 每个模块职责单一
- 可复用性 - 模块可以在多个项目中使用
- 可测试性 - 独立模块更容易测试
头文件和源文件分离
基本概念
- 头文件(.h):包含函数声明、类型定义、宏定义等
- 源文件(.c):包含函数的具体实现
示例:数学工具模块
1. 创建头文件 math_utils.h
#ifndef MATH_UTILS_H // 防止重复包含
#define MATH_UTILS_H
// 函数声明
int add(int a, int b);
int subtract(int a, int b);
int multiply(int a, int b);
double divide(double a, double b);
// 常量定义
#define PI 3.14159265359
// 结构体定义
typedef struct {
double x;
double y;
} Point;
// 函数声明
double point_distance(const Point* p1, const Point* p2);
#endif // MATH_UTILS_H