07 头文件 宏定义
代码多了 分文件整理
1. 头文件写声明
新建 my_code.h:
#ifndef MY_CODE_H
#define MY_CODE_H
int max(int a, int b);
#endif
int max(int a, int b); 是函数声明,告诉编译器函数的参数和返回类型。
头文件里的#ifndef、#define、#endif 用来防止头文件重复声明同一个源文件。
2. 源文件写实现
新建 my_code.c:
#include "my_code.h"
int max(int a, int b)
{
if (a > b) {
return a;
}
return b;
}
.c 文件里写函数的具体代码,开头包含自己的头文件。
然后在 main.c 中使用:
#include <stdio.h>
#include "my_code.h"//调用
int main(void)
{
printf("max = %d\n", max(12, 7));
return 0;
}
#include 引入头文件:
-
C语言标准库的头文件用尖括号
<stdio.h>; -
自己的头文件用双引号
"my_code.h"。
3. 编译和链接
-
main.c和my_code.c分别编译,生成目标文件; -
链接器把目标文件和用到的库合在一起,生成可执行程序。
4. 宏定义
#define SAMPLE_COUNT 8
编译前,SAMPLE_COUNT 会被替换成 8。#define 末尾不加分号。
宏也可以带参数:
#define SQUARE(x) ((x) * (x))
printf("%d\n", SQUARE(2 + 3));
SQUARE(2 + 3) 通过宏定义展开成 ((2 + 3) * (2 + 3)),最终结果是 25。
编译开关常这样写(方便调试用):
#define DEBUG_CODE 1
#if DEBUG_CODE
/* 需要调试时才保留的代码 */
#endif
把 DEBUG_ENABLED 改为 0,中间的代码就不参与编译。
5. extern全局变量声明
如果一个变量确实需要多个文件共用,在一个 .c 中定义一次:
int sample_count = 0;
在供其他文件包含的头文件里只写声明,在前面加extern:
extern int sample_count;//增加extern关键字
6. static静态全局变量
如果一个全局变量或函数只给当前文件使用,在前面加 static:
static int count = 0;
static void helper(void);
main()
{
/* ... */
}
static静态局部变量 & static静态全局变量
- 局部变量加上
static,不改变作用域 但生存期会一直到程序结束 - 全局变量加上
static,表示只在当前文件使用
练习
用宏计算平方
在 my_code.h 中定义带参数的宏 SQUARE(x),计算一个数的平方。在 main 中输出 SQUARE(2 + 3) 的结果。
示例输出
square = 25
提示
宏会直接替换文本。给每个参数和整个表达式加括号:((x) * (x))。
参考代码
main.c
#include <stdio.h>
#include "my_code.h"
int main(void)
{
printf("square = %d\n", SQUARE(2 + 3));
return 0;
}
my_code.h
#ifndef MY_CODE_H
#define MY_CODE_H
#define SQUARE(x) ((x) * (x))
#endif
my_code.c
#include "my_code.h"