A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 布鲁兹老爷 中级黑马   /  2015-10-14 01:17  /  793 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


预处理指令就是在代码翻译成01前执行的指令。
所有的预处理指令都是以 # 靠头
预处理指令的作用域,从编写指令一行开始,到文件结束。
1、宏定义
#define 宏名 值     宏名一般用大写。
#defineCOUNT 10
宏在双引号中是不会执行的。

宏也可以定义在函数内部,但是要注意作用域问题。

让宏失效#undef 宏名  代表宏从这行开始失效。

2、带参数的宏
带参数的宏类似于函数,但它比函数更高效
下面是宏的使用

    int num1 = 10;
    int num2 = 3;
   下面,程序在编译成0,1时会把sum(num1, num2)替换为num1 + num2
    int he = sum(num1, num2);
    //运行结果为3

   一个注意点
    int value = sum(2,3) * sun (4, 5);
   结果为19,因为宏只是替换你得代码,上面的代码替换后就变成2+ 3 * 4 + 5
   所以这里要注意。

   如果实在想这样运算,向下面那样定义
#define sum2(v1, v2) (v1 + v2) //把值用括号括起来。
    int value2 = sum2(2,3) * sum(4,5);
   结果是45

   其实上面定义还是不够严谨
   比如
#definepingfang(a) (a * a)
    int value3 = pingfang(2+ 2)/sum(2);
   我们想得到的结果是4,但是实际结果是2因为替换后变成 2 + 2 * 2 + 2 == 8
    8 / 4 == 2

   所以最严谨的是把每个参数都加上括号
#definepingfang2(a) ((a) * (a))
   带参数的宏运行效率比函数高。

3、条件编译
条件编译判断的条件是宏的值。
所以首先要先定义宏,然后在在函数中添加条件编译。

共有3个条件编译
第一个
#if 条件
...code..
#elif 条件2
...code..
#else
...code..
#endif

第二个
#ifdef 宏名
...code...
#endif

第三个
#ifndef 宏名
...code...
#endif

演示
#include <stdio.h>

#define NUM 10

int main()
{
    int a = 5;
    //普通的判断语句,最终会全部参加编译
    if (a == 5) {
       printf("a的值是5\n");
    }else if(a == 9){
       printf("a的值是9\n");
    }else{
       printf("a是其他值\n");
    }
    //条件编译语句,在编译前会把符合上面宏定义的值的语句编译到.o文件中。
#if(NUM == 10)      //#if
   printf("NUM的值是10\n");
#elif(NUM == 4)     //注意是#elif不是 else if
   printf("NUM的值是4\n");
#else               //#else
   printf("NUM是其他值\n");
#endif              //注意必须要有#endif,不加#endif,会把条件成立后面的语句全部删掉。无法编译成功。

    //其他的条件编译指令
    //#indef
#ifdefNUM
    printf("如果定义了宏NUM 就编译这一句\n");
#endif

    //
#ifndefNUM
    printf("如果没定义宏NUM 就编译这一句\n");
#endif
    return 0;
}
//条件编译普通条件判断语句效率高。

4、 #include

1、虽然函数声明可以重复定义,但是会影响编译效率,所以这里有个技巧。在函数的.h文件中加入
#ifndefABC
#defineABC
int sum(int a, int b);
#endif
先判断如果没定义宏ABC,就把条件编译语句中的代码留下。
如果#include了多个这个.h文件,由于这个条件编译,函数声明只会留下一次。
注意:多个函数的.h文件中定义的宏名不能一样,如果一样,编译时就会只留下一个函数声明。所以最好以文件名的大写为宏名。比如JIAFA_H

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马