typedef与define基本使用
参考:
typedef用法 http://www.cnblogs.com/ggjucheng/archive/2011/12/27/2303238.html
#define用法:http://blog.csdn.net/benny5609/article/details/2314541
====typedef=====
使用typedef目的一般有两个:一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。
eg:
typedef int size;
typedef unsigned int WORD;
typedef与数组,指针
一般的数组声明:
char text1[81];
char text2 [81];
可以这样:
typedef char charRef[81];
charRef text1,text2;
一般的指针声明:
char *pText1;
char *pText2;
可以这样:
typedef char * pChar;
pChar pText1;
pChar PText2;
typedef与函数
一般的函数指针声明:
void printfHello(int i);
void (*pFunc)(int);
pFunc = &printfHello;
(*pFunc)(110);
可以看到声明函数指针是比较复杂的,当在多处声明同一个类型的指针变量,代码更加复杂,所以可以用typedef简化:
typedef void (*typeFunc)(int);
typeFunc pFunc;
pFunc = &printfHello;
(*pFunc)(110);
其他地方声明只需要这样:
typeFunc pFuncOther;
这样就更加的简洁易懂了。
=====#define=====
今天整理了一些#define的用法,与大家共享!
1.简单的define定义
#define MAXTIME 1000
define的定义更像是简单的文本替换,而不是作为一个量来使用,这个问题在下面反映的尤为突出。
2.define的“函数定义”
define可以像函数那样接受一些参数,如下
#define max(x,y) (x)>(y)?(x):(y);
这个“函数”没有类型检查,就好像一个函数模板似的,当然,它绝对没有模板那么安全就是了。可以作为一个简单的模板来使用而已。
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)
6.带参数的宏
(1)#define max(a,b) ((a)>(b)? (a),(b))
关键是十分容易产生错误,包括机器和人理解上的差异等等。
(2)#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型指针了。
所以我们在定义的时候,养成一个良好的习惯,建议所有的层次都要加括号。
6.条件编译
ifdef …
(else) …
endif
eg:
ifdef DV22_AUX_INPUT
define AUX_MODE 3
else
define AUY_MODE 3
endif
ifndef XXX … (#else) … #endif
7.防止重复包含(重复定义)
由于头文件包含可以嵌套,那么C文件就有可能包含多次同一个头文件,就可能出现重复定义的问题的。
通过条件编译开关来避免重复包含(重复定义)
例如
#ifndef __headerfileXXX__
#define __headerfileXXX__
/*文件内容*/
#endif
typedef与define基本使用的更多相关文章
- typedef 和 #define 的区别
本文已迁移至: http://www.danfengcao.info/c/c++/2014/02/25/difference-between-define-and-typedef.html typed ...
- typedef与#define的区别
1. typedef typedef故名思意就是类型定义的意思,但是它并不是定义一个新的类型而是给已有的类型起一个别名,在这一点上与引用的含义类似,引用是变量或对象的别名,而typedef定义的是类 ...
- typedef 和define的区别
总结一下typedef和#define的区别 1.概念 #define 它在编译预处理时进行简单的替换,不作正确性检查.它是预处理指令. typedef 它在自己的作用域内给一个已经存在的类型一个别名 ...
- typedef和#define的用法与区别
typedef和#define的用法与区别 typedef和#define的用法与区别 一.typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程 ...
- typedef 与define 的区别
typedef和#define的用法与区别 typedef和#define的用法与区别 一.typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译 ...
- typedef 优于 #define
案例一: 通常讲,typedef要比#define要好,特别是在有指针的场合.请看例子: typedef char *pStr1; #define pStr2 char *; pStr1 s1, s2 ...
- typedef和#define的区别
转自:http://www.cnblogs.com/kerwinshaw/archive/2009/02/02/1382428.html 一.typedef的用法在C/C++语言中,typedef常用 ...
- typedef与define
一.typedef用法 typedef常用来定义一个标识符及关键字的别名,它生效是在语言编译过程,但它并不实际分配内存空间.typedef可以增强程序的可读性,以及标识符的灵活性,但它也有“非直观性” ...
- typedef和define的作用域
typedef: 如果放在所有函数之外,它的作用域就是从它定义开始直到文件尾: 如果放在某个函数内,定义域就是从定义开始直到该函数结尾: #define: 不管是在某个函数内,还是在所有函数之外,作用 ...
- typedef和define具体的具体差别
1) #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,仅仅有在编译已被展开的源程序时才会发现可能的错误并报错.比如: #define PI 3. ...
随机推荐
- solr使用方法 完全匹配
最近一直被solr的搜索困扰,搜索汉字时不能搜索出自己想要的内容,经过研究和查询发现,问题出在没有完全匹配上,主要还是对solr使用不太熟练. 解决方法:以前UserRealname:某某家长,这样搜 ...
- jQuery -> 获取/设置/删除DOM元素的属性
jQuery的属性操作很easy,以下以一个a元素来说明属性的获取/设置/删除操作 <body> <a>jquery.com</a> </body> 加 ...
- ANT的安装和配置(windows)
1.下载:到ANT官方网站http://ant.apache.org/下载最新版本,解压后即可.2.配置环境变量:我的电脑----属性-----高级----环境变量 如:ANT_HOME:C ...
- c基础语法
1 连续写两个分号,第2个分号就是一条空语句,空语句实际是什么也不做,语法是正确的,编译不会出错. 空语句可以增加程序的可读性,可以作为待写的函数体.循环体.语句块.所以,空语句是可以有用的. 2 s ...
- MVC小系列(五)【在过滤器里引入重定向】
在过滤器里引入重定向 过滤器的引入:如果用户进行一个操作,但没有登录,可以在Post方法上加个过滤器以验证用户是否登录,如果登录成功,则继续进行操作,如果没有登录,则实现Url的重定向,进行登录页 授 ...
- 浅析ASP.NET的状态保持
ASP.NET的状态保持:1.viewstate:隐藏域,记录服务器端控件的状态,适用于页面不关闭的情况下多次与服务器交互,页面自己给自己传值:文本框的改变事件.IspostBack也依赖viewst ...
- 时间处理总结(三)javascript与WCF
1.WCF提交时间时,若需接受DateTime需转换为"\/Date(928120800000+0800)\/"这种格式 var DateToJson = function (js ...
- RS485接线 - 为什么要给2线制RS485接3根线?
http://www.chipkin.com/rs485-cables-why-you-need-3-wires-for-2-two-wire-rs485/ RS485needs 3 conducto ...
- 抓取Bing每日图片作为网站首页背景
把Bing搜索的背景图片设置为自己网站的背景,实现背景及资讯的每日更新 效果图如下: 理一下思路,首先我们要抓取Bing的每日图片及最新资讯,然后保存图片及信息到本地,最后显示图片及资讯到网站首页. ...
- [转]CSS 模块
CSS 模块 如果你想知道 CSS 最近发展的转折点,你应该选择去观看 Christopher Chedeau 在2014年11月的 NationJS 大会上做的名称为 CSS in JS 的分享.不 ...