zoukankan      html  css  js  c++  java
  • ios 预处理 宏 #define

       

        目录:

        (1)分类

        (2)特点

        (3)宏定义的基本操作

        (4)宏的高级用法:(带参数的用法)

        (5)条件编译指令

      一、分类:

             (1)文件包含指令:#include

             (2) 宏定义

             (3)条件编译指令

        二、特点:

             (1)都是以#开头

             (2)预处理指令都是在编译之前执行

             (3)预处理指令后面都没有分号

        三、宏定义的基本操作

           1、 预处理命令,在编译之前运行

           2、 作用:可以为一段代码定义1个标识,如果要使用这个代码,直接使用标识就可以

           3 、 语法: #define  宏名  值    

    #define 宏名    值
    #define name  @"张三"

             

            4、 原理:在预编译的时候,就会执行源文件中的预处理命令

                         会将代码中使用宏名的地方替换为宏值

          

            5、需要注意的地方:

                (1)宏值可以是任意的东西,定义的时候并不会检查语法;

                (2)如果宏值是一个表达式,那么宏值并不是这个表达式的结果,而是这个表达式本身;

    #define num (1+10+90)

                (3)如果宏值当中包含变量名,在使用之前必须保证这个变量已经存在

    #define Q   a+a

                 (4)宏的作用域:

                      可以定义在函数的内部,也可以定义在函数的外面

                      从定义宏的地方,后面的所有的地方,都可以直接使用;

               (5)#undef  宏名

                      可以让指定的宏提前消失

               (6)双引号中的内容不会认为是宏名;

               (7)宏的层层替换,可以使用 

    #define h 3
    #define w 3.14
    #define S h*w

                 (8)宏值后面可以添加分号,但是添加的分号作为宏值一起给宏名; 

               (9) 可以定义任意代码段为宏

               

                #define和 typedef的区别:

                 1).  #define是一个预处理指令,在预编译的时候执行,在预编译的时候把宏名替换成宏值;

                        typedef是C语言代码, 在代码云行的时候才会执行,

                2)#define 可以将任意的代码取1个标识符

                     typedef只能为数据类型取名字 

         四、宏的高级用法:(带参数的用法)

               1.使用有参数的宏,就必须在使用的时候传值     

    #define N(a) a+a+a
    //使用
    N(1
    #define sum(a,b) a+b
    //使用
    sum(1, 2)

            注意: 使用:宏不是函数,宏的参数不需要加类型

                       如果换行,宏就结束了

             

              五、 条件编译指令

                   1、 (1) 预处理指令,预编译阶段执行

                        (2)可以让编译器只编译部分指令

                   2、使用:

                        条件编译的条件只能是宏,不能是函数变量     

             

                (1)、#ifndef

    #endif
    #ifndef DEBUG  //如果没有定义DEBUG这个宏就执行下面的第d%行
    #define NSLog(...) NSLog(@"%s 第%d行 
     %@
    
    ",__func__,__LINE__,[NSString stringWithFormat:__VA_ARGS__])
    #else         //否则的话就执行NSLog
    #define NSLog(...)
    #endif

      (2)、#ifdef

    #ifdef DEBUG  //如果定义DEBUG这个宏就执行下面的第d%行
    #define NSLog(...) NSLog(@"%s 第%d行 
     %@
    
    ",__func__,__LINE__,[NSString stringWithFormat:__VA_ARGS__])
    #else         //否则的话就执行NSLog
    #define NSLog(...)
    #endif

    (3)、#if   else

    #if debug==0
    #define BASEURL @"测试"
    #else
    #define BASEURL @"正式"
    #endif

          

             

  • 相关阅读:
    对struts2的简单理解
    对xml文件封装思想的处理
    反射技术
    设计模式之观察者模式
    设计模式之单例模式
    浅谈对象的克隆
    细说 过滤篇
    flex html 用flex展示html
    git同一文件由于文件名大小写不同导致不能合并
    关于C#引用Dll后,找不到命名空间的问题
  • 原文地址:https://www.cnblogs.com/huihuizhang/p/12789205.html
Copyright © 2011-2022 走看看