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

来源:互联网 发布:ov7670摄像头数据手册 编辑:程序博客网 时间:2024/06/14 05:30

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;

}



0 0
原创粉丝点击