预处理和条件编译

发布时间 2023-06-16 14:24:59作者: eiSouthBoy

一、问题引入

在编程过程中,使用预处理指令最多的是:

  • #define BUFFER_MAX_SIZE 1024 //明示常量

  • #include "xxx.h" //头文件包含

但其他预处理指令使用的稍微少点,例如:#ifdef #else #endif #ifndef #if #elif #line #error #pragma

二、解决过程

2-1 避免用户自定义头文件重复包含

若头文件:user1.h 中已经包含头文件:user.h了,但在源文件src.c中进行如下包含操作便会报错:

src.c

#include "user1.h"
#include "user.h"

//...

原因:因为预处理器对头文件user1.h展开的所有头文件都会包含进来,包括user.h,然而用户在源文件中又一次把user.h包含进来

正确处理user.h的重复包含可以这样处理:

user.h

#ifndef __USER_H__
#define __USER_H__

//...

#endif

2-2 debug模式

在编写代码过程少不了进行测试打印输出,以及来回修改。一般人可能会来来回回进行编写、删除,但其实可以通过条件编译解决,只需要一个宏开关。

#include <stdio.h>

#define DEBUG

int main(void)
{
    int list[5] = {1, 2, 3, 4, 5};
    #ifdef DEBUG // 若宏DEBUG定义了,则编译如下代码
        printf("debug mode:\n");
    #endif // 结束一个if预处理
    for (int i = 0; i < 5; ++i)
    {
        printf("list[%d]:%d\n", i, list[i]);
    }

    return 0;
}

若想取消debug mode,仅需要注释语句:#define DEBUG 即可

三、反思总结

四、参考引用

C Primer Plus (第6版) 中文版