首页 > 代码库 > C++宏

C++宏

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

__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;}