• C++中宏的定义与用法(现已被内联函数所代替)


    在noip中,宏还是被经常采用,所以这里讲一下,C++中宏的定义与用法

    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   (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++中内联函数也可以实现这种功能的。

  • 相关阅读:
    洛谷 P1057 传球游戏
    BZOJ 1801: [Ahoi2009]chess 中国象棋
    BZOJ 1806: [Ioi2007]Miners 矿工配餐
    51nod 1276 岛屿的数量
    BZOJ 1800: [Ahoi2009]fly 飞行棋
    路由控制和视图层
    django的零碎注意点
    Django框架简介
    Bootstrap框架
    jQuery基础知识
  • 原文地址:https://www.cnblogs.com/jjzzx/p/5122494.html
Copyright © 2020-2023  润新知