系统自带的几个比较有用的宏
__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; }
时间: 2024-11-08 22:10:38