预处理与宏定义
Tutorial: C与汇编
Category: C语言
Published: 2026-04-07 13:58:26
Views: 20
Likes: 0
Comments: 0
1. 举例
1. 定义常量
#define PI 3.14159265358979323846
#define MAX_SIZE 100
2. 函数宏
#define SQR(x) ((x) * (x))
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#define GREET(name) (printf("Hello, %s!\n", name))
3.条件编译宏(预处理)
#define DEBUG 1
#ifdef DEBUG
printf("Debug information\n");
#endif
#ifndef RELEASE
#endif
#if defined (WIN32)
#elif defined (LINUX)
#endif
4. 宏运算符
#define TO_STRING(x) #x
#define CONCAT(a, b) a ## b
char str[] = TO_STRING(123);
int xy = 100;
int val = CONCAT(x, y);
请注意,虽然宏定义功能强大,但也有不少缺点:
宏定义在预处理阶段进行文本替换,可能导致意料之外的结果,特别是在复杂的表达式中。
宏函数不提供类型检查,且可能因为多次计算它的参数而产生副作用。
调试宏可能比调试函数困难,因为宏扩展后的代码可能与原始宏定义相差很多。
因此,在许多情况下,内联函数、常量和枚举也许是更好的选择,因为它们提供了类型安全并更易于调试。
2. 预处理指令整理
#define:
用于定义宏,可以是一个值(常量宏)或者是一个带有参数的宏(函数宏)。
#undef:
取消已经定义的宏定义。
#include:
用于包含外部文件。有两种形式,#include <filename> 用于标准库头文件,而 #include
#ifdef:
如果定义了指定的宏,则编译紧随其后的代码。
#ifndef:
如果没有定义指定的宏,则编译紧随其后的代码。常用于防止头文件被多次包含。
#if:
基于条件表达式的结果,如果为真,则编译紧随其后的代码。
#elif:
与 #if 类似,但用作 #if 的“else if”部分。
#else:
与 #if 或 #ifdef 和 #ifndef 指令配合使用,用于当条件不满足时编译紧随其后的代码。
#endif:
结束一个 #if、#ifdef、#ifndef 块。
#error:
当预处理器遇到 #error 指令时,会生成一个编译时错误并中断编译过程。
#pragma:
提供了一种机制以向编译器发送额外的指令。所支持的 #pragma 指令依赖于具体编译器。
#line:
允许改变编译器报告的当前行号和文件名,这可能会影响错误消息和 __LINE__ 及 __FILE__ 这两个预定义宏的值。
#warning(不是标准C,某些编译器支持):
允许生成一条编译警告。
3. 文件包含
1. 创建module.c文件
2. 头文件添加函数声明
3. 其他文件引用(#include "xxx.h")