C++中宏的定义与用法(现已被内联函数所代替)
2016-01-11 20:49
543 查看
在noip中,宏还是被经常采用,所以这里讲一下,C++中宏的定义与用法
第一种用法——配合条件编译:#define DEBUG
定义一个叫DEBUG的标识符。它应该与#ifdef或#ifndef配合使用。举例如下:
如果符号DEBUG存在,那么编译器会编译上面的、能输出数值的print,否则编译器编译下面的、什么事情都不做的print。
把上面的#ifdef换成#ifndef,那么编译的代码正好上面所说的相反。
2.第二种用法——表达式:
编译时,编译器会用类似于“查找和替换”的方法,把代码中的N换成5000。如果需要换成表达式,应该用括号把它们包围。例如:
编译时上面一行会变成“c=1+2*2; d=(1+2)*1;”,显然它们的值是不同的。
此外,要注意表达式末尾不能有分号(除非你需要)。
3.第三种用法——简易“函数”:
#define FtoC(a) (((a)-32)/9*5)
这类似于一个函数。不过,由于编译器只是进行简单替换,所以为了安全,a、b应该用括号包围,整个表达式也应该用括号包围。
这种“函数”用法和普通函数一样,且速度更快。然而,它很容易出现难以查出的错误。所以,请用内联函数(inline)代替宏定义。
注意,不要在“参数”中改变变量的值!
4.第四种用法——简化一段代码:
不要忘记每行后面的“\”,它相当于换行符。这次move简化了一大段代码。当然,在c++中内联函数也可以实现这种功能的。
第一种用法——配合条件编译:#define DEBUG
定义一个叫DEBUG的标识符。它应该与#ifdef或#ifndef配合使用。举例如下:
#define DEBUG #ifdef DEBUG void print(int v) { cout << v << endl;} #else void print(int) {} #endif
如果符号DEBUG存在,那么编译器会编译上面的、能输出数值的print,否则编译器编译下面的、什么事情都不做的print。
把上面的#ifdef换成#ifndef,那么编译的代码正好上面所说的相反。
2.第二种用法——表达式:
#define N 5000
编译时,编译器会用类似于“查找和替换”的方法,把代码中的N换成5000。如果需要换成表达式,应该用括号把它们包围。例如:
#define a 1+2 #define b (1+2) c=a*2; d=b*2;
编译时上面一行会变成“c=1+2*2; d=(1+2)*1;”,显然它们的值是不同的。
此外,要注意表达式末尾不能有分号(除非你需要)。
3.第三种用法——简易“函数”:
#define FtoC(a) (((a)-32)/9*5)
这类似于一个函数。不过,由于编译器只是进行简单替换,所以为了安全,a、b应该用括号包围,整个表达式也应该用括号包围。
这种“函数”用法和普通函数一样,且速度更快。然而,它很容易出现难以查出的错误。所以,请用内联函数(inline)代替宏定义。
注意,不要在“参数”中改变变量的值!
4.第四种用法——简化一段代码:
#define move(dx, dy) if (isfull(dir)) return; \ if (map(x+dx, y+dy)=='0') \ { \ push(dir,x+dx,y+dy,head[dir], dep); \ check(dir); \ }
不要忘记每行后面的“\”,它相当于换行符。这次move简化了一大段代码。当然,在c++中内联函数也可以实现这种功能的。
相关文章推荐
- C++中宏和函数的区别
- 【银行家算法】操作系统课程设计
- C++中vector向量的用法(自整)
- C++中四种类型转换方式
- C++中预处理(宏详解)
- bind--C++11
- 柔性数组
- sort函数的用法(C++排序库函数的调用)
- C++ ATL 中list中删除操作
- c/c++中指针的理解(初学者)
- 【复数的四则运算(C++)】
- iOS第五天 C语言 函数
- log4cpp安装使用
- C/C++文件操作效率比较——FILE/fstream
- c++ 模板 迭代器 使用问题解决方法(too few template-parameter-lists)
- C++浮点数输出位数控制相关函数
- 热门游戏 2048 C++ 源代码分享
- C++虚函数的底层实现原理
- Leetcode 16 - 3Sum Closest
- C语言-C的世界观