C语言之预处理

前言:

编程流程 包括编辑、编译(这里指gcc main.c  //a.out )、运行、调试 。

其中编译过程又可以分为以下四步:

编译过程:
  1.预处理,即预编译,作用是将 代码中相关 预处理命令执行 最终生产一个 只包含c语言代码的文件 
  2.编译,(注意区分编程流程的编译)。对语法进行检查,将这个c的源代码 生产 汇编代码 
  3.汇编 ,表示将 汇编源代码 最终生成 机器代码 。

  4.链接,将使用到的其它代码了链接到一起 生成 最终可执行文件。

本文主要介绍预处理部分

目录

预处理  

1.1宏定义

1.2 带参宏定义

2.文件包含

3.条件编译

(1). 形式1

(2)形式2

(3) 形式3


预处理  

1.1宏定义

语法:
         
    #define 宏名   宏值  
   
   注意:
    1. 预处理命令 都是以 # 开头的 
    2. 宏名 命名规则 和 之前标识符命名规则一致 
       注意: 宏名一般都写大写 ,以区别与普通变量名 
    3. 预处理 实际上 是将 宏名 用 宏值(预处理阶段的 字符串) 进行文本替换  
       注意: c语言字符串中出现的 "宏名" 不会被替换 
           
    4. 应用 
       a. 提高代码可读性   
       b. 一改全改,方便代码修改 
     
    5. 宏名的 作用域
    
    #undef 宏名   
    表示 取消 宏名的 定义 
    注意:只是在预处理阶段发挥作用。
    作用范围:从定义处开始,到 #undef 结束
eg:

  #define N 10  //表示编写代码时,可以使用N表示数字10 。

1.2 带参宏定义

带参宏定义: //宏函数 
语法:
    #define 宏名(参数) 宏值 
eg:
   #define ADD(a,b) a+b 
  

带参宏 和 函数有本质的   区别

 a.处理阶段不一样 

宏定义 --预处理阶段。

函数   --编译阶段 

b.使用不一样

宏  -- 预处理阶段  就使用结束了,宏的使用,本质上,是文本的原样替换。

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

函数 -- 调用时,才进行使用, 函数的使用,本质上是函数代码的调用 。

函数的参数,是有类型的,编译阶段是要进行类型检查的。

c.应用

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

 d.宏的副作用

#define MUL(a,b) a*b;

int a = MUL(1+2, 3+4);  

以上代码就是宏的副作用倒置的,实际上a的值为11,这是因为实际上MUL(1+2,1+3)被替换成了 1+2 * 3+4这个式子,由于乘法优先级高,会先算乘法

处理:把能加括号的地方都加括号,如上面代码中的a*b 写成((a)* (b))。

 e.宏定义必须写在一行,否则必须加续行符(\),且后面不能有空格。

2.文件包含

#include <文件名>

 #include "文件名"

  <> 与 "" 
 区别在于,查找头文件的方式不一样 
   <>  //到系统默认的路径寻找对应的头文件 。
   ""  //表示先到当下目录下寻找头文件,如没有,再到系统默认路径下寻找。

3.条件编译

(1). 形式1

 #ifdef 标识符
    程序段 1
  #else
    程序段 2
  #endif  
  
  含义:
     如果 定义了 标识符 
     则 预处理程序段1  //就是将程序段1的代码 保留 
     否则 保留程序段2

  用途:调试代码 、设计头文件

(2)形式2

 #ifndef 标识符
        程序段1
     #else
        程序段2
     #endif
      
    含义:
     如果 没有定义了 标识符 
     则 预处理 程序段1  //就是将程序段1的代码 保留 
     否则 处理 程序段2

作用:防止多次包含,带来重复定义的问题 

(3) 形式3

 #if 表达式
      程序段1
    #else
      程序段2
    #endif
     
    含义:
       表达式为真 处理程序段1 表达式为假 处理程度段2     
eg:
  #if 0
   ...
  #endif

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值