C语言之模块化、预处理(条件编译)

1. C 模块化

  • 模块化编程的核心思想: 将系统的各个功能进行封装,变成一个个独立的模块,其他人只需要使用你所提供的 函数 和 变量 等,就可以完成相对应的功能.

  • 模块化的本质也就是,新建一个.c和.h文件

1.1. 头文件 .h

#include 可以引用用户和系统头文件。

1.1.1. 用户头文件

  • 为了防止 一个头文件被引用两次,编译器会处理两次头文件的内容 的错误.
    标准的做法是把文件的整个内容放在条件编译语句中,如下:

    文件名 Xxx.h 开头大写

    #ifndef HEADER_FILE
    #define HEADER_FILE
    
    the entire header file file( 定义宏, 定义结构体, extern 变量, 声明函数 )
    
    #endif
    
  • HEADER_FILE 格式:

    1. 以 _ 开头(结尾);
    2. 将 . 换成 _ ;
    3. 字符全部大写.

1.1.2. extern 关键字

extern 这个关键字的真正的作用是引用不在同一个文件中的变量或者函数

    1. .h文件定义extern变量文件:   extern unsigned int **全局**变量名
    2. .c文件使用extern变量的文件: unsigned int **全局**变量名

1.2. c文件

    1. include "xxx.h" // .c文件中,开头小写(.h文件 开头大写)
    2. 将.h文件中的 `extern` 关键字修饰的变量 在.c文件中去掉 `extern` 再声明一次
    3. 将.h文件中的函数声明写出函数体.

2. 预处理指令(以 # 开头)

2.1. 宏定义

#define  标识符()  常量   //注意, 最后没有分号

程序中用标识符来表示这个常量. 一直到源程序结束, 提前终止:

#undef  标识符

2.2. 条件编译

  • #if、#elif、#else 和 #endif 都是预处理命令,
  • 在预处理阶段执行, 根据情况保留代码, 不仅保证了代码正确, 还减小了编译后文件的体积. 这种机制被称为条件编译

在这里插入图片描述

### 2.2.1. DEBUG实例 
```c
/* 条件编译: 只保留符合条件的代码 */
#include <stdio.h>

#define DEBUG 1 // 0 NO; 1 YES

int main()
{
#if DEBUG
    printf("DEBUG...\n");
#endif

    return 0;
}
```

2.3. #ifdef、#ifndef、#endif

#ifdef     判断某个宏是否被定义,若已定义,执行随后的语句
#ifndef    与#ifdef相反,判断某个宏是否未被定义

实例链接

2.4. defined() 运算符

预处理器 defined 运算符是用在常量表达式中的,用来确定一个标识符是否已经使用 #define 定义过。
已定义,则值为真(非零)。
未定义,则值为假(零)。

#include <stdio.h>

#define DEBUG "定义DEBUG" //定义DEBUG

#if defined(DEBUG) //DEBUG已经定义了, true
#undef DEBUG
#define DEBUG printf("您已定义DEBUG\n")

#else
#define DEBUG printf("已为您定义DEBUG\n")

#endif
int main()
{
    
    
    DEBUG;

    return 0;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_46372074/article/details/127007310
今日推荐