#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( ...
随机推荐
- git学习一
一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以 ...
- [BILL WEI] stimulsoft 分组页眉页脚的使用
我们在通过stimulsoft设计报表的时候,有的时候,需要做出如下图报表样式 这个时候,因为箱号是分开扩展的,我们就需要用到分组页眉了,如下图demo跟实例所示:
- 为移动Web应用创建快速响应按钮
英文原文出自 Google Deveploers<Creating Fast Buttons for Mobile Web Applications>,由XiaoYi_HD翻译,并首发于 ...
- DOM笔记(一):HTMLDocument接口
操作HTML文档的第一步就是获取对文档元素的引用,每一个元素在DOM中就是一个节点,所有的元素在DOM中构成一个节点树. 用于获取元素节点定义的方法定义于HTMLDocument接口,window.d ...
- document.getElementsByClassName方法的重写(OVERRIDE)
众所周知,对于IE8以下的浏览器(IE8居然是WIN7预装的)没有document.getElementsByClassName,网上也有很多重写的方法,以下是本人在项目中所使用的方法 documen ...
- 二分+最短路 uvalive 3270 Simplified GSM Network(推荐)
// 二分+最短路 uvalive 3270 Simplified GSM Network(推荐) // 题意:已知B(1≤B≤50)个信号站和C(1≤C≤50)座城市的坐标,坐标的绝对值不大于100 ...
- wine的中文字体显示
从1.1.4开始wine的界面就已经支持中文了,但是对于软件中的中文支持并不太好,主要原因.还是字体...Let's go 首先,copy一下字体:把simsun.ttc (即宋体)复制到 ~/.wi ...
- 【转】nginx的优缺点
原博文出自于:http://blog.csdn.net/a454211787/article/details/22494485 感谢! 1.nginx相对于apache优点: 轻量级同样起we ...
- 国外PHP学习网站书籍资料汇总
这篇文章汇总了全面多样的PHP学习资源,包括书籍.网站.文章等,帮助你提高PHP开发能力,巩固PHP知识.结合上一篇<重磅资料!Github上的PHP资源汇总大全>,一定可以让你的PHP技 ...
- homework09-虐心的现程设终于要告一段落了
V3.0版本今天凌晨出炉 添加了随机生成 添加了文件打开 完全按照老师的要求搞定了 V2.0版本更新 添加了中间数组变量显示 这次作业写了整整一天,把以前能用的代码都改了一个遍 最后变成了网页版的小程 ...