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;
}
原文地址:https://www.cnblogs.com/yican/p/3918375.html