您的位置:首页 > 职场人生

黑马程序员--IOS学习笔记总结 预处理指令(宏定义、条件编译、文件包含)

2015-04-12 21:29 656 查看
---------------------- <a href="http://www.itheima.com"target="blank">iOS开发</a>、期待与您交流!
----------------------
一 、预处理指令-宏定义

        宏定义可以分为2种:不带参数的宏定义和带参数的宏定义。

     1. 不带参数的宏定义

          一般形式:     #define  宏名 字符串            比如  #define A   20   

         字符串也可以省略,比如 #define A 

          作用: 它的作用是在编译预处理时,将源程序中所有"宏名"替换成右边的"字符串",常用来定义常量。

          注意: 1> 宏名一般用大写字母,以便与变量名区别开来,但用小写也没有语法错误

                     
2> 对程序中用双引号扩起来的字符串内的字符,不进行宏的替换操作。比如:

                #define R 10

                int main ()

                {

                 char *s =
"Read";

                 return
0;

                }
              3> 在编译预处理用字符串替换宏名时,不作语法检查,只是简单的字符串替换。只有在编译的时候才对已经展开宏名的源程序进行语法检查。
                     4> 宏名的有效范围是从定义位置到文件结束。如果需要终止宏定义的作用域,可以用#undef命令
                     5>定义一个宏时可以引用已经定义的宏名

                          #define R 2.0     

                          #define Pi 3.14

                          #define L 2*Pi*R

      2. 带参数的宏定义

          一般形式:      #define  宏名(参数列表)  字符串

          作用:在编译预处理时,将源程序中所有宏名替换成字符串,并且将字符串中的参数用宏名右边参数列表中的参数替换

          注意:1>宏名和参数列表之间不能有空格,否则空格后面的所有字符串都作为替换的字符串

                    2> 带参数的宏在展开时,只作简单的字符和参数的替换,不进行任何计算操作。所以在定义宏时,一般用一个小括号括住字符串的参数。

         下面定义一个宏P(a),作用是返回a的平方:
                  * 如果不用小括号括住计算结果

       #include <stdio.h>

       #define Pow(a) (a) * (a)
       int main(int argc,constchar *
argv[]) {
       int b =Pow(10) /Pow(2);
       printf("%d", b);
       return0;
       }
          最后的变量b为:100     // int b = 10 * (10/2) *2;
                   * 如果用小括号括住计算结果
                    将上面的第二行代码改为:#define Pow(a)((a)*(a))
                    那么第四行被替换为:int b = ((10)*(10))/ ((2)*(2));
         最后输出的结果是:25
     ** 与函数的区别:

         从整个使用过程可以发现,带参数的宏定义,在源程序中出现的形式与函数很像。但是两者是有本质区别的:
         1>宏定义不涉及存储空间的分配、参数类型匹配、参数传递、返回值问题。
         2>函数调用在程序运行时执行,而宏替换只在编译预处理阶段进行,所以带参数的宏比函数具有更高的执行效率

二 、预处理指令-条件编译

         在很多情况下,我们希望程序的其中一部分代码只有在满足一定条件时才进行编译,否则不参与编译(只有参与编译的代码最终才能被执行),这就是条件编译。

     1. 基本用法

      #if 条件1
      ...code1...

      #elif 条件2
      ...code2...

      #else
      ...code3...

      #endif
       1> 如果条件1成立,那么编译器就会把#if 与 #elif之间的code1代码编译进去
       2> 如果条件1不成立、条件2成立,那么编译器就会把#elif 与 #else之间的code2代码编译进去
       3> 如果条件1、2都不成立,那么编译器就会把#else 与 #endif之间的code3编译进去
       4> 注意,条件编译结束后,要在最后面加一个#endif,不然后果很严重
       5> #if 和 #elif后面的条件一般是判断宏定义而不是判断变量,因为条件编译是在编译之前做的判断,宏定义也是编译之前定义的,而变量是在运行时才产生的、才有使用的意义

     2. 其他用法
       1> #if defined() 和 #if !defined()的用法

            #if 和 #elif后面的条件不仅仅可以用来判断宏的值,还可以判断是否定义过某个宏,比如:

                        #if   defined(Max)

                              ....code....

                        #endif

           如果前面已经定义过 Max这个宏,就将code编译进去,它不会管Max的值是多少,只要定义过Max,条件就成立。

           条件也
ae8d
可以去反:

                           #if   !defined(Max)
                                  ....code....
                          #endif
            如果前面没有定义过Max这个宏,就将code编译进去。
      2> #ifdef 和 #ifndef的使用

           * #ifdef的使用和#if   defined()的用法基本一致

             #ifdef  Max

                 ......code......

            #endif

           如果前面已经定义过 Max这个宏,就将code编译进去。           

          * #ifndef的使用和#if   !defined()的用法基本一致

            #ifndef  Max

                 ......code......

            #endif

             如果前面没有定义过Max这个宏,就将code编译进去。

三 、预处理指令-文件包含

    1. #include <文件名>    直接到C语言库函数头文件所在的目录中寻找文件

     2. #include “文件名”  系统会先在源程序当前目录下寻找,若找不到,再到操作系统的path路径中查找,最后才到C语言库函数头文件所在目录中查找

 
      ---------------------- <a href="http://www.itheima.com"target="blank">iOS开发</a>、期待与您交流!
----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐