宏定义

[复制链接]
发表于 2023-12-31 10:40:58 | 显示全部楼层 |阅读模式
宏定义
宏定义是C语言的产物。在C++中,它真的out了。
1.  第一种用法——配合条件编译:#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   c=a*2; d=b*2;
  
  
(1+2)  
  
编译时上面一行会变成“c=1+2*2;d=(1+2)*1;”,显然它们的值是不同的。
所以,用enum和const代替它是明智之举。
此外,要注意表达式末尾不能有分号(除非你需要)。
3.  第三种用法——简易“函数”:
#defineFtoC(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简化了一大段代码。同样,内联函数也可以。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表