gcc预处理

目录

编程的流程

编译过程

预处理(预编译)

编译

汇编

连接

预处理

宏定义

带参宏定义

带参宏与函数有本质区别

文件包含

<>和""

条件编译


编程的流程

1.编辑

2.编译

gcc mian.c(源文件)——a.out(机器代码)

3.运行

4.调试

编译过程

预处理(预编译)

将代码中相关预处理命令执行,最终产生一个只包含C语言代码的文件

编译

对语法进行检查,将这个c的源代码生成汇编代码

汇编

表示将汇编源代码最终生产机器代码

连接

将使用到的其他代码连接到一起,生成最终的可执行文件

预处理

——做文本的替换

宏定义

语法:

  • #define 标识符 字符串
  • #define 宏名 宏值

注意:

  • 预处理命令都是以#开头的
  • 宏名的命名规则与之前的标识符命名规则一致

宏名一般都写大写,以便与普通变量区别

  • 预处理实际上是将宏名用宏值(预处理阶段的字符串)原样替换

C语言字符串中出现的“宏名”不会被替换

  • 应用

1.提高代码可读性

2.一改全改(方便代码修改)

  • 宏名的作用域

只是在预处理阶段发挥作用

作用范围:从定义处开始到#undef结束

#undef 宏名——表示取消宏名的定义

eg:#define N 10

含义:表示将来代码出现的N都代表10

编写代码时都可以用N代表数字10

带参宏定义

宏函数(但其实不是函数)

#define 宏名(参数) 宏值

#define ADD(a,b) a+b

带参宏与函数有本质区别
  • 处理阶段不一样

宏定义——预处理阶段

函数——编译阶段

  • 使用不一样

宏——预处理阶段就使用结束了

宏的使用本质上是原样替换

宏的参数只是进行文本替换用,不进行语法检查

函数——调用时进行使用

函数的使用本质上是函数代码的调用

函数的参数时候类型的,编译阶段要进行类型检查

  • 应用

一般对于一些短小的代码(不超过5行的代码),建议写成带参宏

  • 宏的副作用

处理:能加括号的地方尽量加括号 

宏定义一般写在一行

加续行符"\"可以写在多行                          

#include<stdio.h> 
#define ADD(a,b) a+b

int main(void)
{
    int x = 2;
    int y = 5;
    printf("a+b = %d",ADD(x,y));

    return 0;
}

文件包含

#include<文件名>

#include"文件名"

<>和""

区别:寻找头文件的方式不一样

<>到系统默认的路径寻找对应的头文件

""先在当前路径寻找头文件,如果找不到,再到系统默认的路径寻找

条件编译

#ifdef 标识符

        程序段1

#else

        程序段2

#endif

含义:如果定义了标识符,则预处理程序段1(保留程序1的代码);否则保留程序段2

用途:1.调试代码        2.设计头文件

防止多次包含带来重复定义的问题

#ifdnef 标识符

        程序段1

#else

        程序段2

#endif

含义:如果没有定义标识符,则预处理程序段1(保留程序1的代码);否则保留程序段2

#if 表达式

        程序段1

#else

        程序段2

#endif

eg:

#if 0

...

endif

含义:如果表达式为真,则预处理程序段1(保留程序1的代码);否则表达式为假,保留程序段2

  • 12
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值