C++中宏的定义与用法(现已被内联函数所代替)
2024-09-03 02:44:50
在noip中,宏还是被经常采用,所以这里讲一下,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++中内联函数也可以实现这种功能的。
最新文章
- Zephyr OS 简介
- 转载——C++控制台贪吃蛇代码
- Linux内核学习之道
- 遍历List中的object对象
- Python入门笔记(5):对象
- 背景建模SACON
- js cookie操作
- photosop快速对白色背景图片进行抠图
- SAP BW中的增强(转)
- 第46条:for-each循环优先于传统的for循环
- oracle 物化视图及创建索引
- Java里的IO流里的FileReader里的BufferedReader读取并在前打印行数!
- BZOJ 1458: 士兵占领( 网络流 )
- canvas实例:旋转缩放的方块
- iOS 图片裁剪方法
- MVC 树节点Table格式授权
- cf1000E We Need More Bosses (tarjan缩点+树的直径)
- PAT基础6-7
- day5_判断价格输入是否是正整数或正小数
- 【转】SPI总线协议
热门文章
- jvm(5):类加载机制
- 使用 NuGet 包管理器在 Visual Studio 中安装和管理包
- SQL中 select count(1) count中的1 到底是什么意思呢?和count(*)的区别
- 解决win10状态栏的搜索框无法搜索本地应用或无反应
- 每天进步一点点------Allegro 布线时显示延迟以及相对延迟信息
- 每天进步一点点------Allegro 群组布线
- idea中使用Data Source and Drivers时,如果使用自己自定义的jar包
- noobSTL-1-配置器-0
- bbs系统的相关知识点
- 微信个人支付接口---YunGouOS 1.1.3 版本发布,新增个人微信/支付宝收款接口