跳到主要内容

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"
代码
正在准备编辑器…
运行结果