C语言之条件编译的使用

一、本文主要介绍C语言中关于条件编译相关的预处理命令,包含#define、#undef、#ifdef、#ifndef、#if、#elif、#else、#endif。

#define定义一个预处理宏
#undef取消一个预处理宏
#ifdef判断某个预处理宏是否被定义,若定义则编译后续程序段
#ifndef判断某个预处理宏是否没有被定义,若没定义则编译后续程序段
#if判断某个预处理宏的值是否不为0,不为0则编译后续程序段,相当于C语法中的if语句
#elif相当于C语法中的else if 与#if配套使用
#else相当于C语法中的else 与#if、#elif配合使用
#endif'结束条件命令的判断,与#if、#ifdef、#ifndef配套使用

二、条件编译

       预处理程序提供了条件编译的功能,可以按不同的条件去编译不同的程序代码,从而产生不同的目标代码文件。

 1.#define   

        在编译预处理的时候,编译器会对程序中出现的“宏”都用宏定义中的字符串去替换掉宏,需要注意的是,字符串与替换这两个词。

#define     PI     3.1416    //定义宏PI代替圆周率

        最常用的宏定义用法如上,定义字符串宏(PI)后的程序段只要用到了宏(PI),程序在编译的时候,会使用3.1416这个字符串将PI替换掉。

#define    MIN(a, b)    (a) > (b) ? (b) : (a)  //求最小值
#define    MAX(a, b)    (a) > (b) ? (a) : (b)  //求最大值
#define    ADD          (a + b)                

例如这些定义的宏里面带有计算的,宏表达式里面的括号一定要加上,例如

#define    ADD1    a + b
#define    ADD2    (a + b)

int result = 0;

result = ADD1 + ADD1; //结果为 a + b + a + b
result = ADD2 + ADD2; //结果为 (a + b) + (a + b)      使用两条宏定义的结果一样

result = ADD1 * ADD1; //结果为 a + b * a + b
result = ADD2 * ADD2; //结果为(a + b) * (a + b)       使用两条宏定义的结果不一样了
                      

编译器在编译预处理时是将宏名进行替换,所以宏里面的表达式一定要加好括号。避免调用宏时因为运算符优先级的问题出错。

还要一种特殊情况不建议使用宏定义具体代码如下:

#define     SQU(a)     (a * a)    //

int main(int argc, const char *argv[])
{
    int i = 1;
    int result = 0;

    result = SQU(i++);

    printf("%d \n", result);

    return 0;
}

//结果很容易分析出来是:2
//rusult = i++ * i++ = 1 * 2;

对于这种带有++,--运算的时候,不建议使用宏,特别容易出错。

在这里稍微提一下,若是在程序定义大量宏来固化一些数据的话,不如使用枚举,使用枚举的效果一样,但是枚举变量还能作为实参传入函数当中。

2.#undef

取消一个宏定义;

#define     ADD(a, b)     (a + b)

int i = 0;
int v1 = 1;
int v2 = 2;
int result = 0;

result = ADD(v1, v2);

#undef ADD(a, b)

//若在#undef还调用ADD(a, b)的宏,编译程序的时候,编译器会报错

3.#ifdef、#ifndef、#if与#elif

#ifdef、#ifndef与#if的作用相同,只是判断条件不同。

常用形式如下:

//第一种形式
#ifdef  标识符1    //若标识符1已被#define语句定义则只编译程序段1,否则继续判断后面的语句
   
    程序段1

#elif  标识符2    

    程序段2

#else  

    程序段3

#endif

//第二种形式    
#ifndef  标识符1    //若标识符1没有被#define语句定义则只编译程序段1,否则继续判断后面的语句

    程序段1

#elif  标识符2

    程序段2

#else

    程序段3

#endif

//第三种形式
#if  常量表达式1        //若常量表达式1的值不为0则只编译程序段1,否则继续判断后面的语句

    程序段1

#elif  常量表达式2

    程序段2 
      
#else

    程序段3

#endif

 

下面程序举例:

#include <stdio.h>

#define    IFDEF     1
#define    IFNDEF    1
#define    IF        1
#define    NIF       1

int main(int argc, const char *argv)
{
 
#ifdef  IFDEF    

    printf("define IFDEF\n");

#elif   IFNDEF

    printf("define IFNDEF\n");

#else   

    printf("no define \n");

#endif

#if  IF
    
    printf("define IF \n");

#elif  NIF

    printf("define NIF \n");

#else

    printf("no define \n");

#endif 

}

若宏定义为
#define    IFDEF     1
#define    IFNDEF    1
#define    IF        1
#define    NIF       1

程序编译后的执行结果是
define IFDEF
define IF 

若宏定义为
#define    IFNDEF    1
#define    IF        0
#define    NIF       1


程序编译后的执行结果是
define IFNDEF
define NIF 

仓促成文,不当之处,尚祈方家和读者批评指正。联系邮箱1772348223@qq.com

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值