预处理与宏定义

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
    // Debug-only code goes here
#endif

#if defined (WIN32)
    // Windows-specific code goes here
#elif defined (LINUX)
    // Linux-specific code goes here
#endif

4. 宏运算符
#define TO_STRING(x) #x
#define CONCAT(a, b) a ## b
    char str[] = TO_STRING(123); // 展开为 "123"
    int xy = 100;
    int val = CONCAT(x, y); // 展开为 xy

请注意,虽然宏定义功能强大,但也有不少缺点:
宏定义在预处理阶段进行文本替换,可能导致意料之外的结果,特别是在复杂的表达式中。
宏函数不提供类型检查,且可能因为多次计算它的参数而产生副作用。
调试宏可能比调试函数困难,因为宏扩展后的代码可能与原始宏定义相差很多。
因此,在许多情况下,内联函数、常量和枚举也许是更好的选择,因为它们提供了类型安全并更易于调试。
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")
Prev: 函数指针 Next: None