• C++宏


    一个比较好的关于宏的文章http://blog.chinaunix.net/uid-21372424-id-119797.html

    系统自带的几个比较有用的宏

    __TIME__ 系统当前时间,表示方式为H:M:S

    __FILE__ 文件名

    __DATE__ 日期

    __LINE__ 到LINE为止文件代码行数

    带参数的宏----》》》宏函数

    宏的作用就是全部替换

    #include<iostream>
    
    #define SWAP(T, m, n) {T t=m;m=n;n=t;};
    int main()
    {
        using namespace std;
        int a = 10, b = 20;
        double c = 12.3, d = 45.6;
        SWAP(int, a, b)
        SWAP(int, c, d)
        cout << a << "  " << b << endl;
        cout << c << "  " << d << endl;
    
        system("pause");
        return 0;
    }

    下面给出预编译后的代码

    #include<iostream>
    
    #define SWAP(T, m, n) {T t=m;m=n;n=t;};
    int main()
    {
        using namespace std;
        int a = 10, b = 20;
        double c = 12.3, d = 45.6;
        {int t = b; b = a; a = t; };
        {int t = d; d = c; c = t; };
        cout << a << "  " << b << endl;
        cout << c << "  " << d << endl;
    
        system("pause");
        return 0;
    }

    这里可以很明显的看到全部替换的含义,就是一字不漏的替换,千万不要以为这里是像函数传实参传入拷贝副本

    只是把宏定义的代码原封不动的搬到对应的代码行

    带参数宏的几个问题

    1:参数尽量括起来

    #include<iostream>
    
    #define SWAP(T, m, n) {T t=m;m=n;n=t;};
    #define PI 3.14159
    #define AREA(r) PI*r*r      //PI*(r)*(r)可以获得我们想要的结果,所以宏中定义的参数一般都要用括号括起来
    int main()
    {
        using namespace std;
        int a = 10, b = 20;
        double c = 12.3, d = 45.6;
        
        cout << AREA(a) << endl;   //输出结果314.159
        cout << AREA(a+b) << endl;  //传入的是表达式,输出结果215.416
        cout << PI*a + b*a + b;   //输出结果215.416 替换后,并没有按照预期的结果,运算符的优先级使得我们的结果发生了变化
        system("pause");
        return 0;
    }

     2:表达式尽量括起来

    #include<iostream>
    
    #define SWAP(T, m, n) {T t=m;m=n;n=t;};
    #define PI 3.14159
    #define AREA(r) PI*r*r
    #define MAX(x,y) x>y?x:y //用括号括起来(x>y?x:y)这样就可以得到我们想要的结果
    int main()//我这里想返回两个最大值的和,结果却返回的是50,
    {
        using namespace std;
        int a = 10, b = 20, e = 50, f = 60;
        double c = 12.3, d = 45.6;
        
        cout << (MAX(a, b)+MAX(e,f)); //预处理后的结果是x>y?x:y+x>y?x:y;不是我们需要的结果,处理办法是在宏定义出
       
        system("pause");
        return 0;
    }

     宏还有很多其他问题,比如对++运算符,但是只要记住,宏所做的操作全部都是原始替换,将相应的字符替换进去就可以发现错误出在哪里

    宏中另外两个特殊字符的用法

    # ,将参数转化为字符串 比如str(hello),我输入的只是hello,但是我在宏中定义str(r) #r,那么r就转为字符串,可以顺利输出。

    ##, 拼接标示符

    #include<iostream>
    
    #define SWAP(T, m, n) {T t=m;m=n;n=t;};
    #define PI 3.14159
    #define AREA(r) PI*r*r
    #define MAX(x,y) x>y?x:y
    #define welcome(who) welcome##who()
        using namespace std;
        void welcomeAA(){ cout << "A" << endl; };
        void welcomeBB(){ cout << "B" << endl; };
    int main()
    {
        welcome(AA);
        system("pause");
        return 0;
    }
  • 相关阅读:
    RAP开发入门-主题更换
    RAP开发入门-开发笔记-bug记录
    RAP开发入门-运行过程简析(三)
    Redis入门笔记-redis内部数据结构(01)
    JAVA基础-子类继承父类实例化对象过程
    RAP开发入门-开发笔记
    RAP开发入门-运行第一个HelloWorld(二)
    android maven eclipse
    字符与编码(摘录)
    Python 学习lesson 1
  • 原文地址:https://www.cnblogs.com/yican/p/3918375.html
Copyright © 2020-2023  润新知