黑马程序员——c语言基础:宏和条件编译

1.宏

 预处理指令:

    经常写在函数之前的以#开头的指令,作用是在编译前对源文件进行处理,包括宏定义、文件包含和条件编译。

 宏:

    C语言中我们自己定义的特殊标识符,习惯大写

 宏的定义:

    #define 宏名 宏字符串(可以是常量、变量、表达式)

    注意:宏名一般用大写,宏定义末尾不加分号,如加上分号则连分号一起替换

 宏替换:

    源程序在编译之前,由预处理程序对我们写的代码进行处理:会把源代码中所有出现宏名的地方一律使用宏的字符串去替换

 宏的使用注意事项:

    1)宏是有作用域的,#undef 宏名 可以取消宏定义

    2)在字符串中出现的宏名不会被替换

    3)宏可以嵌套定义

 宏的分类:

    无参宏  #define M 10

    有参宏  #define SUM(a) a+a

           SUM(3) // 不仅要用a+a替换,而且还要把实参3代入到字符串中

 有参宏的使用注意事项:

    1)宏的形参之间可以出现空格,但是宏名和形参之间不能出现空格

        #define M(x   , y) x*y+100-y

    2)有参宏的参数最好用括号括起来

        #define M1(x   , y) (x)*(y)+100-(y)

    3)可以用宏来定义多个语句

        #define M2(m,n) m = a +2; n = a*4;

使用举例:

#include <stdio.h>

#define A a*a+100

#define SUM(a,b) a+b

#define M2(m,n) m = a +2; n = a*4;


int main(int argc, const char * argv[]) {

    

    int a = 10;

    //无参宏的使用

    int result = 3*A - A/10 + 2; // 此处会用a*a+100替换A,注意:并不会加上括号

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

    

    // 有参宏的使用

    int result1 = SUM(34,23);

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

    

    // 用宏定义多个语句的使用

    int i = 0;

    int j = 0;

    M2(i, j)

    printf("i = %d j = %d",i, j);


    

    return 0;

}


// 使用有参宏求最大值

#include <stdio.h>

// 定义一个有参宏,求两个数的最大值

#define MAX(a,b) a > b ? a : b

int main(int argc, const char * argv[]) {

    // 使用有参宏求最大值

    printf("%d",MAX(-34, 23));

    return 0;

}



2.条件编译

 条件编译:

    发生在预处理阶段,在编译之前做的事。

    核心:根据条件编译指定的代码,条件不同,编译的部分也不同,生成的目标文件(.o)大小也不一样


 条件编译指令

    1#if #elif #else #endif

    2#ifdef 用来判断某个宏是否定义    

      #ifndef 用来判断某个宏是否没有定义


1)#if - #else 条件编译指令使用:

#include <stdio.h>

#define score 76


int main(int argc, const char * argv[]) {

#if score < 60

    printf("E\n");

#elif score <= 69

    printf("D\n");

#elif score <= 79

    printf("C\n");

#elif score <= 89

    printf("B\n");

#else

    printf("A\n");

    

#endif

    return 0;

}


2) #ifdef #ifndef 条件编译指令使用

#include <stdio.h>

#define DEBUG1 0

int main(int argc, const char * argv[]) {

    

    int a = 0;

#ifdef DEBUG1  // #ifdef检测宏是否定义

    a = 10;

#else

    a = 10000;

#endif

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

    

    // #ifndef 如果宏没有定义

#ifndef DEBUG2

    a = 100;

#else

    a = -1;

#endif

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


    

    return 0;

}



我们可以使用条件编译指令来调试bug,在以下代码中,如果DEBUG1的值设为1,则会输出调试信息,若设为0,则不会输出。

#include <stdio.h>


#define DEBUG1 1


#if DEBUG1 == 1

// 显示调试信息

#define Log(format,...) printf(format,## __VA_ARGS__);


#else

// 不显示调试信息

#define Log(format,...)


#endif


int main(int argc, const char * argv[]) {

    Log("这是调试信息!!!%d\n",2222)

    return 0;

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值