#define用法详解 及#ifndef #define #endif 总结

想要知道三者的关系,不得不先说说#define宏定义。简单来说#define XX  ??? 就是在源码编译之前,将代码中XX全部替换成???. #define用法一般分以下几种:

     1、无参宏定义

      形式为:#define 宏名 字符串

       其中的“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令。“define”为宏定义命令。“标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。

     

例如: #define M (a+b) 在编写源程序时,原先要写的所有的(a+b)都可由M代替,而对源程序作编译时,将先由预处理程序进行宏代换,即用(a+b)表达式去置换所有的宏名M,然后再进行编译。

#include <stdio.h>

#define M (a+b)
...
{...
int s;
s=M*M;
...} 

其中的s=M*M     在编译之前M被替换成"(a+b)",就变成 s=(a+b)*(a+b).括号同样替换。
      需要注意几点:1.宏只是简单替换,并不做任何检查,如有错误只能在编译已被宏展开后的源程序发现。
                               2.宏定义不是说明或者语句,末行不用加分号。如果加分号就会连分号一起替换
                               3.宏定义必须写在函数之外,作用域为从运行到#define开始 至全局程序结束或者#undef位置
       2 、带参宏定义
      形式为:  #define 宏名(形参表)      字符串
      比如:  #define M(y)    ((y)*(y)+3*(y))
                   k=M(5); /*宏调用*/
                    当程序中出现M(数据)时,就替换。记住是替换而不是掉用。(跟函数区别)
                     //----------------------
                    #define MAX(a,b) (a>b)?a:b
        具体说明,跟无参的宏定义类似
       3、条件编译
         条件编译这才是我们今天要学习的重点。这会与#define #ifdef # ifndef挂钩.
        一般情况下,源程序中所以的代码都要进行编译,但是有时候由于嵌套了太多的头文件(.h文件),而头文件中又可能包含相同的类,变量等等。需要编译的时候,就会重复。影响效率不说,还会报错。
          #ifdef XXX…(#else) …#endif
  例如
#ifdef    DV22_AUX_INPUT
        1......     
  #else
        2.....
        #endif 它的作用是:如果DV22_AUX_INPUT定义了且DV22_AUX_INPUT,就执行1处的代码,如果没定义就执行2处的代码。这里要有个问题很困扰过我,我做这篇文章也是因为这个问题。就是 DV22_AUX_INPUT什么时候定义的,对,我们可以在代码的前面自己定义。比如我们定义 #define DV22_AUX_INPUT  这样程序执行的时候就会执行1处的代码了。如果我们没有定义 #define DV22_AUX_INPUT 或者#define DV22_AUX_INPUT 0 这样就会执行2处的代码了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值