为了能到远方,脚下的每一步都不能少.|

Yasuo_Hasaki

园龄:1年1个月粉丝:2关注:0

2024-02-17-物联网C语言(4-预处理)

4.预处理

4.1 c语言的编译过程

gcc -E hello.c -o hello.i # 1.预编译
gcc -S hello.i -o hello.s # 2. 编译
gcc -c hello.s -o hello.o # 3. 汇编
gcc hello.o -o hello_elf # 4. 链接
  1. 预编译

    .c中的头文件展开、宏展开

  2. 编译

    将预处理之后的.i文件生成.s汇编文件

  3. 汇编

    .s汇编文件生成.o目标文件

  4. 链接

    .o文件链接成目标文件

4.2 include

#include <> // 用尖括号包含头文件,在系统指定的目录下找头文件
#include "" // 用双引号包含头文件,在当前目录下找头文件;如果找不到,再到系统目录下找,一般自定义函数使用

注意:

  1. include也可以用来包含.c文件,但是不建议。因为这样会导致.c文件在预编译阶段被展开,如果一个.c被多次展开,会导致重复定义,所以不建议包含.c文件。
  2. 预处理只是对include等预处理操作进行处理,不会进行语法检查,所以这一阶段即便代码有语法错误也不会报错。

4.3 define

定义宏用define,宏是在预编译的时候进行替换

  1. 不带参宏

    #define PI 3.1415926

    注意:宏定义后边不用加分号

  2. 带参宏

    #define S(a,b) (a)*(b)
    #include <stdio.h>
    #define PI 3.1415926
    #define S(a,b) a*b
    int main(){
    printf("PI = %lf\n",PI);
    printf("a * b = %d",S(2,4));
    }

    输出结果

    PI = 3.141593
    a * b = 8

    带参宏与带参函数

    1. 带参宏被调用多少次就会展开多少次,执行代码的时候没有函数调用的过程,不需要压栈弹栈,这是一种空间换时间的做法。

      带参函数,调用的时候需要压栈弹栈,浪费了时间,节省了空间。

    2. 带参函数的形参是有类型的,带参宏的形参是没有类型名的。

    3. 功能简单,不需要太多空间,可选用带参宏;大多数情况下还是选择带参函数

4.4 选择性编译

  1. 第一种形式

    // 如果当前的.c 中定义过AAA,就会编译代码段1,否则编译 代码段2
    #ifdef AAA
    代码段1
    #else
    代码段2
    #endif
  2. 第二种形式

    // 该形式与第一种形式形成互补,这种方法可以防止头文件重复包含
    #ifndef AAA
    代码段1
    #else
    代码段2
    #endif
  3. 第三种形式

    // 如果表达式为真,执行代码段1,否则执行代码段2
    #if 表达式
    代码段1
    #else
    代码段2
    #endif

    选择性编译都是预编译阶段干的事情

posted @   Yasuo_Hasaki  阅读(9)  评论(0编辑  收藏  举报
//雪花飘落效果
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起