#define使用方法
1.简单的define定义
#define MAXTIME 1000
一个简单的MAXTIME就定义好了,它代表1000,假设在程序里面写
if(i<MAXTIME){.........}
编译器在处理这个代码之前会对MAXTIME进行处理替换为1000。
这种定义看起来相似于普通的常量定义CONST,但也有着不同,由于define的定义更像是简单的文本替换,而不是作为一个量来使用,这个问题在以下反映的尤为突出。
2.define的“函数定义”
define能够像函数那样接受一些參数,例如以下
#define max(x,y) (x)>(y)?(x):(y);
这个定义就将返回两个数中较大的那个,看到了吗?由于这个“函数”没有类型检查,就好像一个函数模板似的,当然,它绝对没有模板那么安全就是了。能够作为一个简单的模板来使用而已。
可是这样做的话存在隐患,样例例如以下:
#define Add(a,b) a+b;
在一般使用的时候是没有问题的,可是假设遇到如:c * Add(a,b) * d的时候就会出现故障,代数式的本意是a+b然后去和c,d相乘,可是由于使用了define(它仅仅是一个简单的替换),所以式子实际上变成了
c*a + b*d
另外举一个样例:
#define pin (int*);
pin a,b;
本意是a和b都是int型指针,可是实际上变成int* a,b;
a是int型指针,而b是int型变量。
这是应该使用typedef来取代define,这样a和b就都是int型指针了。
所以我们在定义的时候,养成一个良好的习惯,建议全部的层次都要加括号。
3.宏的单行定义
#define A(x) T_##x
#define B(x) #@x
#define C(x) #x
我们如果:x=1,则有:
A(1)------〉T_1
B(1)------〉'1'
C(1)------〉"1"
(这里參考了 hustli的文章)
3.define的多行定义
define能够替代多行的代码,比如MFC中的宏定义(很的经典,尽管让人看了恶心)
#define MACRO(arg1, arg2) do { /
/* declarations */ /
stmt1; /
stmt2; /
/* ... */ /
} while(0) /* (no trailing ; ) */
关键是要在每个换行的时候加上一个"/"
摘抄自http://www.blog.edu.cn/user1/16293/archives/2005/115370.shtml 修补了几个bug
4.在大规模的开发过程中,特别是跨平台和系统的软件里,define最重要的功能是条件编译。
就是:
#ifdef WINDOWS
......
......
#endif
#ifdef LINUX
......
......
#endif
能够在编译的时候通过#define设置编译环境
5.怎样定义宏、取消宏
//定义宏
#define [MacroName] [MacroValue]
//取消宏
#undef [MacroName]
普通宏
#define PI (3.1415926)
带參数的宏
#define max(a,b) ((a)>(b)? (a),(b))
关键是十分easy产生错误,包含机器和人理解上的差异等等。
6.条件编译
#ifdef XXX…(#else) …#endif
比如 #ifdef DV22_AUX_INPUT
#define AUX_MODE 3
#else
#define AUY_MODE 3
#endif
#ifndef XXX … (#else) … #endif
7.头文件(.h)能够被头文件或C文件包括;
反复包括(反复定义)
因为头文件包括能够嵌套,那么C文件就有可能包括多次同一个头文件,就可能出现反复定义的问题的。
通过条件编译开关来避免反复包括(反复定义)
比如
#ifndef __headerfileXXX__
#define __headerfileXXX__
…
文件内容
…
#endif
以上仅仅是我从网络上搜集了一些关于define的一些使用方法,可能还不全面,并且#define的使用本来也存在这争议,假设你对#define的使用方法也非常有兴趣,能够来參加我们的讨论(点击以下的链接)
http://www.dingge.com/forum/dispbbs.asp?boardID=43&ID=6972&page=1
| #define和typedef的差别 |
| 1) #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,仅仅有在编译已被展开的源程序时才会发现可能的错误并报错。比如: #define PI 3.1415926 程序中的:area=PI*r*r 会替换为3.1415926*r*r 假设你把#define语句中的数字9 写成字母g 预处理也照样带入。 2)typedef是在编译时处理的。它在自己的作用域内给一个已经存在的类型一个别名,可是You cannot use the typedef specifier inside a function definition。 3)typedef int * int_ptr; //refer to (xzgyb(老达摩)) typedef int* int_ptr; 这也说明了为什么以下观点成立 那么: pint是一种指针类型 const pint p 就是把指针给锁住了 p不可更改 3)或许您已经注意到#define 不是语句 不要在行末加分号,否则 会连分号一块置换。 |
#define使用方法的更多相关文章
- Unable to execute dex: Multiple dex files define 解决方法
程序编译正常,在用Eclipse调试执行时,报错Unable to execute dex: Multiple dex files define: 方法: 原因是有重复的.jar被引用,可以 ...
- eclipse:运行 Android 项目时出现 “Unable to execute dex: Multiple dex files define” 解决方法
android 项目在eclipse 出现Unable to execute dex: Multiple dex files define Conversion to Dalvik format fa ...
- Unable to execute dex:Multuple dex files define 解决方法
困扰我两天的问题终于解决了,在网上查的方法无非有三种 一. Eclipse->Project->去掉Build Automatically->Clear ->Build Pro ...
- define定义方法
define('a',function(){ ; return x; }); define('b',['a'],function(a){ ; return y+a; }); M.use(['b'],f ...
- [Android开发常见问题-11] Unable to execute dex: Multiple dex files define 解决方法
最近在开发一个工程,其中用到了一个开源的库项目Android-ViewPagerIndicator. 这个项目是作为一个库出现的,如下图: 这个项目中包含了android-support-v4.jar ...
- 转:Unable to execute dex: Multiple dex files define 解决方法
转自:http://blog.csdn.net/mxlxiao7/article/details/8978930 问题发生概述: 程序编译正常,在用Eclipse调试执行时,报错Unable to e ...
- IOS 基础-define、const、extern、全局变量
这里介绍一下define.const.extern的用法.优劣以及要注意的地方. 1.define 宏define是定义一个变量,没有类型信息.define定义的常量在内存中有若干个拷贝. defin ...
- 为什么很多人使用#define而不是const定义常量
众所周知,C语言一开始只有#define,C程序员用#define定义符号常量.但后来ANSI C加入了const限定符,而const应该比#define更好,为什么现在的C程序员还在大量使用#def ...
- C语言#和##操作符使用方法
1.#操作符 1:#操作符用于预处理阶段,将宏参数转换为字符串,只有宏定义中使用(#define) 使用方法: #define STRING(x) #x printf( ...
随机推荐
- Selenium用户扩展
Selenium用户扩展 这很容易扩展Selenium IDE加入自定义操作,断言和定位,策略,这是通过添加方法,在JavaScript的帮助下Selenium 对象原型.在启动时,Selenium会 ...
- hashtable,hashMap,vector和ArrayList
关于vector,ArrayList,hashMap和hashtable之间的区别 vector和ArrayList: 线程方面: vector是旧的,是线程安全的 ArrayList是java ...
- hadoop1.2.1 伪分布式配置
主要配置 core-site.xml hdfs-site.xml mapred-site.xml
- sql联接那点儿事儿
1.交叉联接(cross join) select * from t.toy ,b.boy from toy as t cross join boy as b 其效果同select * from t. ...
- C++多态分析(polymorphisn)
前言 借着这次学校的生产实习来回顾下C++的多态,这里讨论下C++的多态以及实现原理.我都是在QT下使用C++的,就直接在QT下进行演示了 多态介绍 面向对象语言中最核心的几个理念就是:封装.继承.多 ...
- 新手指导:教你如何查看识别hadoop是32位还是64位
问题导读: 1.从哪些地方可以识别hadoop是32位还是64位?2.hadoop本地库在什么位置? 来源:about云 本文链接:http://www.aboutyun.com/thread-127 ...
- KVM背靠Linux好乘凉
虚拟化是走向云的第一步,同理,开源虚拟化是走向开源云的第一步.云计算所提供的产品与方案都是围绕着IT资源的新交付与消费模式.云的形式多样,私有云.公有云与混合云,无论哪种云都具有三个关键特征:虚拟化. ...
- 虚拟桌面基础架构(VDI)与终端服务和传统PC对比
VDI(Virtual Desktop Infrastructure),即虚拟桌面基础架构,正迅速成为一个热门词汇,它将颠覆企业向终端用户交付应用的游戏规则.这篇专题就是想通过VDI与两种传统技术的对 ...
- Windows Server 2012 四个版本对比
Windows Server 2012 有4种版本: Foundation, Essentials, Standard and Datacenter. 版本 Foundation Essentials ...
- Fast Intro To Java Programming (2)
Java局部变量 局部变量声明在方法.构造方法或者语句块中: 局部变量在方法.构造方法.或者语句块被执行的时候创建,当它们执行完成后,变量将会被销毁: 访问修饰符不能用于局部变量: 局部变量只在声明它 ...