1、#ifndef 和 #define 的基本用法
#ifndef 是 条件编译指令,意思是“如果没有定义”。它通常与 #define 一起使用来定义一个宏,表示某个头文件是否已经被包含过。#define 用于定义一个宏或常量。如果宏已经定义,则编译器会跳过后续的定义。
#ifndef HEADER_FILE_NAME_H #define HEADER_FILE_NAME_H // 头文件内容 #endif // HEADER_FILE_NAME_H
2、防止头文件重复包含
当在多个源文件中使用相同的头文件时,如果没有适当的保护,编译器可能会遇到头文件被重复包含的情况,导致编译错误。
// a.h int a; // b.h #include "a.h" // main.c #include "a.h" // 第二次包含 a.h 可能会导致重复定义错误 #include "b.h"
代码中 a.h
被包含了两次,导致重复定义 int a。
这时,预处理指令 #ifndef
和 #define
就能防止这个问题。在头文件中使用 #ifndef
和 #define
,可以避免头文件被多次包含。
// a.h #ifndef A_H #define A_H int a; #endif
3、多个头文件的保护
每个头文件都应使用唯一的宏名(通常采用文件名的大写形式)进行保护。
// a.h #ifndef A_H #define A_H int a; #endif // b.h #ifndef B_H #define B_H int b; #endif // main.c #include "a.h" #include "b.h" #include "a.h" // 重复包含 a.h,但不会导致编译错误
4、常用宏
宏 | 用途 | 示例 |
---|---|---|
#define | 定义常量或宏函数 | #define PI 3.14 |
#ifdef | 条件编译 | #ifdef DEBUG |
#ifndef | 条件编译(未定义宏时) | #ifndef MAX_SIZE |
NULL | 空指针定义 | int *ptr = NULL; |
#undef | 取消宏定义 | #undef MAX |
#include | 引入头文件 | #include <stdio.h> |
sizeof | 获取数据类型或变量的大小(字节数) | sizeof(int) |