精华内容
下载资源
问答
  • 宏函数

    万次阅读 多人点赞 2018-08-22 17:48:32
    宏函数 宏函数在预处理的时候就会替换成相应的语句,十分像c++里面的模板。它的优点比正常函数更高效因为不用栈帧的开销,但是它的缺点就是1 没有类型检测 2 可能具有副作用 3可能导致代码量的增加这样会导致...

      #define 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏,以下是宏的声明方式

    #define name( parament-list ) stuff
    

      参数列表是由,隔开的一个符号表。 参数列表可带可不带,如果带参数列表的话必须与name紧邻否则会被解析成stuff的一部分。基于这个原理我们可以使用这个参数列表来实现函数。
      需要注意的是宏参数和#define定义可以包含其他#define定义的符号。但是,宏不可以出现递归。

    #define M 9
    #define PRINT( FORMAT, VALUE )    \
            printf("the value is  " FORMAT"\n" , M+VALUE);
    int main()        
    {
         PRINT("%d" ,M);
         return 0;
    }
    
    

    宏的特殊符号

      #与 ## 是俩个特殊符号,它们的含义如下

    1. # 表示将一个宏参数变成一个字符串
    2. ## 表把俩个字符串粘在一起
    #define PRINT(VALUE) \
       printf(#VALUE);
    #define STRCAT(str1,str2) \
          str1##str2
    

    宏函数

    宏函数在预处理的时候就会替换成相应的语句,十分像c++里面的模板。它的优点比正常函数更高效因为不用栈帧的开销,但是它的缺点就是1 没有类型检测 2 可能具有副作用 3可能导致代码量的增加这样会导致源文件变得更大4没有返回值。本文直接给出宏函数的应用。

    应用

    拷贝构造申请对象
    #define  CHECK_AND_SET_OBJECT(obj,name,type)   \
       do  \
       {    \
          if(obj == NULL)  {  \
             printf("obj 为 NULL\n"); \
           } \
          type name(obj); \
       } while(0) 
               
    
    标识形参

    有的时候我们想知道这个函数声明的形参是输入参数还是输出参数,我们可以这样使用宏

    #define IN
    #define OUT
    #define INOUT
    void Fun( OUT  int * p); // p 为输出参数
    void Fun2(IN int num); // num 为输入参数
    
    巧妙的使用宏函数

    有的时候可以把相关宏放头文件,通过增加头文件的宏,来修改代码,这个用法比较秀。如果下面这份代码,我们可以通过在Command.h中增加宏来改变 SomeThing.h 中 AllocHandler的逻辑,增加Get 则可以申请Get* 的数据,增加Set则可以申请Set* 的数据

    Basic_Command.h 
    Command_Header(Get)
    
    Command.h
    enum CommantType {
      ZERO = 0,
      #define Command_Header(Command) Command##_TYPE,
      #include "Basic_Command.h"
      #undef Command_Header
      MAXCOMMAND
    };
    
    SomeThing.h 
    void AllocHandler(CommandType type)
    {
    #define Command_Header(Command) \
            if(Command##_TYPE == type) { \
               Handlers[type] = new Command##Handler(); 
            }
    #include "Command.h"
    #undef Command_Header
     return ;
    } 
    
    main.cc
    #include "GetHandler.h"
    #include "SomeThing.h"
    int main() {
      AllocHandler(1);
      return 0;
    } 
     
    

    可变参数宏

    宏可以简单的使用可变参数。只要在形参表最后一个加 … 即可。所有的可变参数使用__VA_ARGS__ 宏代替。 ## VA_ARGS 可消除 ## 前面的相应符号。如果不加##, LOG(“TEST”) 会被替换成 printf("%s:%d" “TEST”, func, LINE, ); ,从替换结果看多了一个 , 号。我们需要把这个 , 去掉所以得使用 ##去删除

    LOG (format, ...)  \
             prinft ( "%s:%d"  format , __func__, __LINE__, ## __VA_ARGS__);
    

    宏实现c++模板函数

    如下面的实例宏 EXTERN_INSTANCE 就实现了模板函数 CreateInstance 和 DestroyInstance 函数。

    MacroUtils.h
    EXPORT_INSTANCE(type) \ 
    void CreateInstance(type*& object) {
        object = new type();
    }
    void DestroyInstance(type*& object) {
        delete object;
        object = NULL;
    }
    
    
    main.cc
    class A {
    };
    EXPORT_INSTANCE(A);
    int main()
    {
       A* p = NULL;
       CreateInstance(p);
       DestroyInstance(p);
       return 0;
     }
    

    Linux 宏调试

    1. 增加编译选项 -g3
    2. gdb -> macro expand 具体宏
    3. step 进去宏函数就行
    展开全文
  • 要写好C语言,漂亮的定义是非常重要的。定义可以帮助我们防止出错,提高代码的可移植性和可读性等。
  • Source Insight 自定义宏函数

    热门讨论 2011-11-05 14:57:58
    自己编写的SourceInsight宏函数(增加了很多实用的功能,欢饮交流指正^_^) ****************************************************************************** * 函数列表 * * 1. AutoExp if、for、switch、...
  • C语言基础--宏函数

    千次阅读 2020-06-07 15:43:45
    C语言基础–宏函数 1. 函数和数据类型 函数式宏(宏函数)和函数类比会更加灵活,我们通过两个例子来看一下。 函数 #include <stdio.h> int sqr_int(int x) { return x*x; } double sqr_double(double x) { ...

    C语言基础–宏函数

    1. 函数和数据类型

    1. 函数式宏(宏函数)和函数类比会更加灵活,我们通过两个例子来看一下。

      函数

      #include <stdio.h>
      int sqr_int(int x)
      {
          return x*x;
      }
      
      double sqr_double(double x)
      {
          return x*x;
      }
      
      int main(int argc , char *argv[])
      {
          int n;
          double x;
          
          printf("请输入一个整数:\n");
          scanf("%d",&n);
          printf("%d的平方是:%d\n",n,sqr_int(n));
          
          printf("请输入一个实数:\n");
          scanf("%lf",&n);
          printf("%lf的平方是:%lf\n",n,sqr_double(n));
          
          return 0;
      }
      
      • 当然了,如果计算long int,或者long long int型的数据类型的话我们还得编写该类型的函数。可以 遇见,如果这样下去代码中将会充斥着大量功能相近,名称相似的函数,看起来非常糟糕。
      • 下面来看一下函数式宏的实现:

      函数式宏

      #include <stdio.h>
      
      #define sqr(x) ((x)*(x))
      
      int main(int argc,char *argv[])
      {
          int n;
          double x;
          
          printf("请输入一个整数:\n");
          scanf("%d",&n);
          printf("%d的平方是:%d\n",n,sqr(n));
          
          printf("请输入一个实数:\n");
          scanf("%lf",&n);
          printf("%lf的平方是:%lf\n",n,sqr(n));
          
          return 0;
      }
      
      • 可以看到一个简单的宏函数就实现了几个函数才能实现的事情,当然了宏函数可不止这点儿能耐。
      • 本例中类似sqr(@) —>展开为((@)*(@))的形式就称为宏展开
      • 当调用该宏函数的时候,就会在调用位置将该宏函数展开为上述形式。
      • 值得注意的是宏定义只做替换不做计算,这一点很重要,后面会再提到。

    2. 函数和函数式宏

    • 从上面可以看到函数式宏在某些时候可以替代函数的作用,它们的区别如下:
    1. 函数式宏是在编译时展开并填入程序的

    2. 而函数定义则需要为每个形参都定义各自的数据类型,返回值类型也只能为一种。函数更为严格。

    3. 函数默默的为我们进行一些复杂的操作,比如:

      1. 参数传递(将实参值赋值给形参)
      2. 函数调用和函数返回操作
      3. 返回值的传递

      而函数式宏只是做宏展开,并不做上述处理。

    4. 函数式宏能是程序的运行速度稍微提高一点儿,但是当函数中有大量的宏替换的时候,又会使得程序变得臃肿。(原理是宏函数只做替换,并没有类似函数调用的跳转、参数出入栈等操作,自然会提高函数的运行速度。这种运行速度加快体验在大量使用的时候尤为明显)

    5. 宏在使用的时候必须小心谨慎,避免出现问题。这一点是有宏的本身特性决定,即只做替换不做计算。举例来说明:

      宏的副作用

      情况一:

      #define sqr(a) ((a)*(a))
      

      若调用该函数式宏计算sqr(a++),展开后就变为:((a++) * (a++)),可以发现a执行了两次自增操作。这就会造成隐形的错误,比如我只是想将a自增1后在求其平方,但是结果却并非我们所想。

      情况二:

      宏定义与宏函数

      假如我们在sqr 和’('之间多敲了一个空格,如下

      #define sqr (a) ((a)*(a))
      

      那么此时函数式宏就变成了,宏定义了,也成对象式宏。即sqr会被编译器替换成(x) (x)*(x)

      在定义宏函数的时候注意宏函数名和’('之间不能有空格。

      情况三:

      #define sum(x,y) x + y	//注意:不规范的函数式宏的定义
      
      //调用
      z = sum(a,b) * sum(c,d);
      //编译器将其展开后就变为:
      z = a + b * c + d;	//这样是不是偏离了我们的本意
      

      因此,我们在定义函数式宏的时候与一定要每个参数以及整个表达式都用()括起来,就不会出错了。上面的就可以改为

      #define sum(x,y) ((x) + (y))	//正确的定义方法
      //调用
      z = sum(a,b) * sum(c,d);
      /编译器将其展开后就变为:
      z = ((a) + (b)) * ((c) + (d));
      

      总结,在定义和使用函数式宏的时候要注意避免其产生副作用

    3. 不带参数的函数式宏

    • 函数式宏也可以像函数那样不带参数

      #define my_print() (printf("你好啊!\n"))
      

    4. 函数式宏和逗号表达式

    • 下面将说明函数式宏使用时的一个重要技巧
    #include <stdio.h>
    
    #define puts_alert(str)  {putchar('\a');puts(str);}
    
    int main(int argc,char *argv[])
    {
        int n;
        
        printf("请输入一个整数:");
        scanf("%d",&n);
        
        if(n)
            puts_alert("这个数不是0.");
        else
            puts_alert("这个数是0.");
        
        return 0;
    }
    
    • 当我们运行这个程序的时候会报错,无法运行。提示else 缺少if

      因为将该函数式宏展开后就变为:

    #include <stdio.h>
    
    #define puts_alert(str)  {putchar('\a');puts(str);}
    
    //当然了,如果一行定义不下,有时候为了美观我们也这样写,'\'表示下一行还有内容
    #define puts_alert(str)  {putchar('\a'); 	\
    						   puts(str);}
    
    int main(int argc,char *argv[])
    {
        int n;
        
        printf("请输入一个整数:");
        scanf("%d",&n);
        
        if(n)
            {putchar('\a');puts(str);};
        else
            {putchar('\a');puts(str);};
        
        return 0;
    }
    
    • 很明显,if下的复合语句’}‘后的’;‘会被认为是空语句,那么此时else再去找它上面的那个if的时候就找不到了,因此就会报错。当然了函数式宏中的’{}'也不能少,若少了又会报其他的错误。怎么解决呢?可以思考一下。当然了,也可以参见下面一节

    5. 函数式宏和逗号表达式

    • 上面一节我们看到了当函数式宏中有多条需要执行的语句的时候我么遇到了麻烦,下面各处解决方法:
    #include <stdio.h>
    
    #define puts_alert(str)  (putchar('\a'),puts(str))
    
    int main(int argc,char *argv[])
    {
        int n;
        
        printf("请输入一个整数:");
        scanf("%d",&n);
        
        if(n)
            puts_alert("这个数不是0.");
        else
            puts_alert("这个数是0.");
        
        return 0;
    }
    
    //在if处展开
        if(n)
            (putchar('\a'),puts(str));
        else
            (putchar('\a'),puts(str));
    
    • 这里有个知识点,逗号表达式。逗号运算符:

      表达式a,表达式b —> 按顺序判断a和b,整个表达式最终生成表达式b的判断结果。当然了,若有多个表达式(整个逗号表达式的值为最后一个表达式的值),可以以此类推。

      举个例子:

      int a = 3,b = 4,z = 0;
      z = ++a,++b;	
    //执行时a的值会自增1,b的值也会自增1,最终将b自增后的值赋给变量z
    //此时z的值为5,也就是最终整个逗号表达式的结果。
    

    可以看到:整个逗号表达式中每个语句都会被计算到

    如果想要了解更多的逗号表达式的知识可以参考下我的另一博文:
    逗号运算符与逗号表达式

    6. 总结

    • 函数式宏在使用时很方便,正确使用的话不仅可以使得我们的程序变得简洁,而且可以提高我们程序的运行速度。
    • 但是这种方式有时也很容易出错,所以我们在使用的时候一定要非常小心,避免出错。
    展开全文
  • Excel 4.0 宏函数

    2011-02-17 09:30:40
    Excel 4.0 宏函数 259个例子,实用全面 大师级掌控
  • 宏函数的使用

    千次阅读 2019-10-20 19:46:34
    #include<stdio.h> #define SWAP(a, b, t) { t=a; a=b; b=t; } #define SWAP(a, b, t) t=a; a=b;... 宏函数,在一定程度上比普通函数效率高,普通函数会有入栈和出栈时间上的开销 通常将...
    #include<stdio.h>
    
    #define SWAP(a, b, t) { t=a; a=b; b=t; } 
    #define SWAP(a, b, t) t=a; a=b; b=t;     
    #define MYADD(x,y) ((x)+(y))
    
    /*
    	宏函数,要保证运算的完整性
    	宏函数,在一定程度上比普通函数效率高,普通函数会有入栈和出栈时间上的开销
    	通常将一些比较频繁、短小的函数封装为宏函数
    	优点:以空间换时间
            宏函数会原样替换
    */
    
    int myAdd(int x, int y){
    	return x + y;
    }
    
    void test01(){
    	int a = 10;
    	int b = 20;
    	int ret = MYADD(10,20)*20;//((10)+(20))*20
    	printf("ret=%d\n",ret);
    }
    int main(){
    	
    }

     

    展开全文
  • 内联函数与宏函数的区别

    千次阅读 2018-08-07 22:04:20
    以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率 特性 inline是一种以空间换时间的做法,省去调用函数额开销。所以代码很...

    内联函数


    概念

    以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率


    特性

    1. inline是一种以空间换时间的做法,省去调用函数额开销。所以代码很长或者有循环/递归的的函数不适宜使用内联
      2.inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等等,编译器优化时会忽略掉内联
      3.inline必须函数定义放在一起,才能成为内联函数,仅将inline放在声明前是不起作用的
      4.定义在类内的成员函数默认定义为内联函数

    注意事项

    在C++中,强制建议使用const代替宏常量,使用内联函数代替宏函数,const和内联函数在进行编译时不仅进行替换,而且还会进行参数类型检测,提高了程序的安全性。内敛函数可以是普通函数,也可以是类的成员函数;函数式宏不能作为类的成员函数.



    宏的相关知识点


    宏函数与普通函数对比


    优点:宏函数在预处理期间会进行宏替换,没有函数压栈开销,运行效率高。
    缺点:

    1.不安全(不会进行类型检测)
    2.代码复用率不高
    3.不停的进行替换,增长代码长度
    4.不能调试


    宏和内联函数的区别


    1.内联函数采用的是值传递,而宏定义采用的是对等替换.
    2.宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销
    3.编译器在调用一个内联函数时,会首先检查它的参数的类型,保证调用正确。然后进行一系列的相关检查,就像对待任何一个真正的函数一样。这样就消除了它的隐患和局限性。


    相关链接


    注意事项:
    1.在内联函数内不允许用循环语句和开关语句和递归。
    2.内联函数的定义必须出现在内联函数第一次被调用之前。


    define与const的区别


    a.用#define MAX 255定义的常量是没有类型的,所给出的是一个立即数,编译器只是把所定义的常量值与所定义的常量的名字联系起来,define所定义的宏变量在预处理的时候进行替换,在程序中使用到该常量的地方都要进行拷贝替换;
    b.用const float MAX = 255; 定义的常量有类型名字,存放在内存的静态区域中,在程序运行过程中const变量只有一个拷贝,而#define 所定义的宏变量却有多个拷贝,所以宏定义在程序运行过程中所消耗的内存要比const变量的大得多;
    c.用define定义的常量是不可以用指针变量去指向的,用const定义的常量是可以用指针去指向该常量的地址的;
    d.用define可以定义一些简单的函数,const是不可以定义函数的.


    具体来说,有以下几方面的区别:
    1.编译器处理方式
    define – 在预处理阶段进行替换
    const – 在编译时确定其值
    2.类型检查
    define – 无类型,不进行类型安全检查,可能会产生意想不到的错误
    const – 有数据类型,编译时会进行类型检查
    3.内存空间
    define – 不分配内存,给出的是立即数,有多少次使用就进行多少次替换,在内存中会有多个拷贝,消耗内存大
    const – 在静态存储区中分配空间,在程序运行过程中内存中只有一个拷贝
    4.其他

    a.在编译时, 编译器通常不为const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
    b.宏替换只作替换,不做计算,不做表达式求解。
    c.宏定义的作用范围仅限于当前文件。
    d.默认状态下,const对象只在文件内有效,当多个文件中出现了同名的const变量时,等同于在不同文件中分别定义了独立的变量。 如果想在多个文件之间共享const对象,必须在变量定义之前添加extern关键字(在声明和定义时都要)。


    展开全文
  • C语言宏定义、宏函数、内置宏与常用宏

    万次阅读 多人点赞 2018-09-30 17:48:43
    而C语言(C++)特有的两把双刃剑指针和宏定义/宏函数使得C语言在底层开发中披荆斩棘、无所不能。这两个概念涉及范围比较广,其分支点也比较多,可谓星罗棋布,但这每颗星都足以照亮C语言因其开发周期、可维护性、可...
  • SAS学习笔记44 宏函数

    千次阅读 2019-09-30 17:53:19
    类SAS函数的宏函数 该部分函数共5个,其无论是名字、语法、功能都与SAS函数类似,只是在函数名前多了一个“%”。这5个宏函数分别是: %INDEX %LENGTH %SCAN %SUBSTR %UPCASE 需要...
  • 关于宏函数的返回值

    万次阅读 2018-05-09 17:04:18
    宏函数与普通函数 // 宏函数 #define Min(x, y) \ ((x)&lt;(y)?(x):(y)) // 普通函数 int Min(int x, int y) { return x &lt; y ? x : y; } 普通函数,在定义时需要指明返回类型及返回值 宏函数,在...
  • 宏函数和函数的区别及其优缺点

    千次阅读 2017-08-11 10:17:09
    定义,编译预处理指令,在编译预处理时即进行简单的字符替换,也只进行简单的字符替换。而定义的函数和用户定义的函数在使用时有什么区别?如下:
  • 宏函数的返回值

    2019-11-17 10:38:57
    宏函数,在定义时不需要指明返回类型及返回值 宏函数中最后一个表达式的值,即为宏函数的返回值。 该值的类型,即为宏函数的返回类型。 #define Min(x, y) ((x)<(y)?(x):(y) int main() { int a = 10; int...
  • ABAP-子程序宏函数学习笔记.py
  • C语言自定义打印宏函数

    千次阅读 2018-08-27 22:29:14
    宏函数实现在头文件中,加上了打印级别来控制打印是否输出,打印级别的设定需在调用的.c文件中自定义(这样做是为了能实现不同文件的打印级别能不一样,在调试指定文件或模块的问题是,能起到屏蔽其他无关代码打印的...
  • C++中的函数指针与宏函数总结

    千次阅读 2017-11-13 16:52:17
    今天看项目代码才发现,函数指针分两种:普通函数指针,类成员函数指针。 那这两中函数指针的定义方法是不一样的。 1、普通函数指针typedef void (*Dfun) (float, int); //(*Dfun) 实际上是(::*Dfun) 也就是...
  • 宏定义与宏函数

    千次阅读 2016-12-05 17:10:26
    定义又称为代换、替换,简称"",在程序编译过程中进行替换的。 格式: #define 标识符 字符串 其中的标识符就是所谓的符号常量,也称为"宏名"。 预处理(预编译)工作也叫做展开:将宏名替换为字符串...
  • C语言重载宏函数的小技巧

    千次阅读 2017-12-04 23:54:38
    在写C/C++语言时我们经常会用到宏定义,宏函数就是带参数的宏定义(blablabla……省去背景介绍)。 有时候我们会需要一个可以有多种参数版本的宏定义,例如: 12#define MACRO_FUN(a) doSomethingWithOneArg...
  • 什么是宏函数?2.宏函数与普通函数的相同点?不同点?3.宏函数与普通函数的优缺点?什么是宏函数?在这之前看一下宏的定义:宏宏是根据一系列预定义的规则替换一定的文本模式。#define BUFFER_SIZE 1024预处理阶段,...
  • 这篇文章主要是讲述Word通过宏函数设置一些操作,比如在Word全文中替换一些符号;再如对Word上角表进行编号,如果删除中间某个值,运行宏函数自动编号;对Word中所有图片进行大小统一整合;文章竖着排版等操作。Word...
  • 宏函数和函数的区别及优缺点

    千次阅读 2017-07-31 16:14:20
    宏函数:#define MAX(a,b) ((a)>(b)?(a):(b)) 普通函数:MAX(a,b) {return a>b?a:b} 1.宏做的是简单的字符串的替换,而函数是参数的传递,参数是有数据类型的。 2.宏的参数替换是直接替换的,不经任何计算,而函数...
  • 宏函数怎么写(在多文件下使用)

    千次阅读 2018-12-19 19:45:43
    记录一下宏函数怎么写,以后忘了可以回来看看自己写的代码。 本次写的宏函数是打印错误信息代码并且退出。环境是ubuntu16.04.编译器是gcc g++是5.4版本。 上代码: 1 #include &lt;stdio.h&gt; 2 #...
  • #define定义宏函数 的正确使用

    万次阅读 2019-02-23 15:33:16
    如何使用宏来定义一个自定义函数呢? 首先我们来看下面这段代码 #define SQUARE(x) x*x int main() { int a = 5; printf("SQUARE(a): %d\n",SQUARE(a)); //这个值为25 printf("SQUARE(a+1): %d\n&...
  • 宏、函数、宏函数的区别

    千次阅读 2015-07-15 10:47:55
    宏、函数、宏函数的区别 先说宏和函数的区别: 1. 宏做的是简单的字符串替换(注意是字符串的替换,不是其他类型参数的替换),而函数的参数的传递,参数是有数据类型的,可以是各种各样的类型. 2. 宏的参数...
  • [博客资源]Source Insight 自定义快捷键宏函数编写用例程序
  • define定义宏函数

    千次阅读 2019-01-27 18:07:16
    #define ERR_EXIT(m)\ do\ {\ perror(m);\ exit(EXIT_FAILURE);\ }while(0) c语言在定义函数的时候,如果有换行的话要加 ' \ ' 。我佛了c语言!...
  • 带参数的宏定义(宏函数

    千次阅读 2017-04-15 09:38:37
    宏函数没有普通函数压栈、跳转、返回等的开销,可以提高程序的效率。 宏的名字中不能有空格;用括号括住每一个参数,并括住宏的整体定义;用大写字母表示宏的函数名。 #define SUM(a,b) ((x)+(y)) 在程序中...
  • 带返回值的宏函数

    千次阅读 2017-07-12 15:36:00
    在c语言中,很多的库函数都是用宏来实现的,下面我们来看一个函数,你不一定要知道它是什么函数,但你可以看到这个函数是怎么实现的,这个函数是sigfillset(sigset_t *set),是一个来自unix中的定义信号集的一个函数...
  • 在我们看内核源码或者库以及一些优秀的源码时,都会发现他们的宏函数是包括在do{…}while(0)内。具体的原因其实想想就能明白。考虑下面一个特殊的例子。 宏函数的定义如下:#define test(x) \ a(x); \ b(x);如果在...
  • iOS 定义一个有返回值的宏函数

    千次阅读 2016-11-15 09:28:02
    #define GetURLWith(tag) \ ({\  NSString *url=@"";\  if (tag==1)\  url=@"http://www.xxx.com:";\  else if (tag==2)\  url=@"http://www.xxx-test.com:";\  els

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 382,235
精华内容 152,894
关键字:

宏函数