C语言 条件编译(宏)

本文介绍了C语言的预处理指令,包括#define、#undef、#if、#ifdef、#ifndef等条件编译宏的使用,以及宏中运算符#和##的功能。讲解了#if指令如何根据条件编译代码,以及如何通过#endif和#elif来控制编译流程。

开始之前,我先列出在开发工程中经常用到的部分预处理指令:

#define <#macro#> // 定义宏

#undef <#macro#> // 取消宏

#if <#condition#> // 如果给定的condition为真,则编译下面的代码

#ifdef <#macro#> // 如果宏已定义,则编译下面的代码

#ifndef <#macro#> // 如果宏没有被定义,则编译下面的代码

#elif <#condition#> 如果前面的#if给定条件为假,当前的条件为真,则编译下面的代码

#endif // 结束一个#if...#else条件编译块

#error <#message#> // 停止编译并显示错误信息


一、宏中的运算符

在定义宏时,经常会出现的两个运算符 # 和 ##

#:出现在宏定义中的#运算符,会将其后面参数转化为一个字符串。我们把这种用法的成为字符串化运算符。

#define AXE__PASTE(x) "drift"#x

int main(int argc, const char * argv[]) {
    
    @autoreleasepool {
        // insert code here...
        
        printf("%s\n", AXE__PASTE(_Axe));
        //-> drift_Axe
        
        
    }
    return 0;
}
##:常用于把多个参数连接在一起。__NSX_PASTE__(A,B)是系统提供的一个宏,可自行查阅。

printf("%d\n",__NSX_PASTE__(95, 27));
//-> 9527


二、条件编译指令

1、#if 指令用于检测后面的常量表达式,如果为真,则编译接下来的代码,直到出现 #else、#elif、#endif为止;否则就不编译。

2、#endif 指令用于终止#if预处理指令。

#define AXE_TAG 0

int main(int argc, const char * argv[]) {
    
    @autoreleasepool {
        // 由于定义的AXE_TAG宏代表0,#if条件为假,不编译后面的代码,直到#endif,最后只输出BB。去掉 #define AXE_TAG 0语句,效果也是一样的。
#if AXE_TAG
        printf("AA\n");
#endif
        printf("BB\n");
        
    }
    return 0;
}
3、#ifdef和#ifndef

#define _FBI_WARNING_

int main(int argc, const char * argv[]) {
    
    @autoreleasepool {
   
       /* START */

#ifdef _FBI_WARNING_
        printf("YES\n");
#endif
        
#ifndef _FBI_WARNING_
        printf("NO\n");
#endif
 
        /*等价于*/
        
#if defined(_FBI_WARNING_)
        printf("YES\n");
#endif
        
#if !defined(_FBI_WARNING_)
        printf("NO\n");
#endif
        
        /* END */
        
    }
    return 0;
}

4、#else指令

#define _FBI_WARNING_

int main(int argc, const char * argv[]) {
    
    @autoreleasepool {
   
       /* START */
        
#ifdef _FBI_WARNING_
        printf("YES\n");
#else
        printf("NO\n");
#endif
        
        /* END */
        
    }
    return 0;
}
5、#elif指令

#elif预处理指令综合了#if和#else指令的作用

#define _FBI_WARNING_

int main(int argc, const char * argv[]) {
    
    @autoreleasepool {
   
       /* START */
        
#ifdef _FBI_WARNING_
        printf("YES\n");
#elif FBI_WARNING
        printf("Unknown\n");
#else
        printf("NO\n");
#endif
        
        /* END */
        
    }
    return 0;
}

暂时先写到这个,以后碰到了再补充~。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值