twzheng's cppblog
『站在风口浪尖紧握住鼠标旋转!』 http://www.cnblogs.com/twzheng
C++博客
::
首页
::
新随笔
::
联系
::
聚合
::
管理
::
136 随笔 :: 78 文章 :: 353 评论 :: 0 Trackbacks
<
2007年9月
>
日
一
二
三
四
五
六
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
公告
【正在找工作,麻烦推荐,感谢!】 【自我评价】 1. 资深软件工程师/项目经理,工作9年,3年经验带开发团队,2年经验项目管理,同时具备IBM大型机(z/OS390, COBOL)和开放平台(C#/Java) 开发经验。 2. 熟悉基金/债券业务系统和信用卡业务,目前是花旗软件直属员工,负责基金/债券系统。 3. 由于家人和小孩都在武汉,迫切想换工作回武汉,理想工作地是金融港和光谷软件园。 【期望职能】 项目经理 | 项目主管 | 高级软件工程师 | 需求工程师 | 其他 【期望行业】 计算机软件 | 互联网/电子商务 | 金融/投资/证券 | 银行 | 信托/担保/拍卖/典当
留言簿
(14)
给我留言
查看公开留言
查看私人留言
随笔分类
(130)
Crystal Report(5)
(rss)
Flash AS 3.0(2)
(rss)
Java学习笔记(3)
(rss)
windows 编程(7)
(rss)
基础知识(27)
(rss)
生活拾趣(42)
(rss)
数据库(14)
(rss)
特别关注(13)
(rss)
网络编程(7)
(rss)
兴趣爱好(10)
(rss)
在线求助
(rss)
文章分类
(87)
AsWing(2)
(rss)
C#(7)
(rss)
C/C++(17)
(rss)
ESFramework(4)
(rss)
Flash ActionScript(16)
(rss)
Java(1)
(rss)
vc++.net(10)
(rss)
windows 编程(3)
(rss)
电脑常识(8)
(rss)
算法和数据结构(3)
(rss)
网络编程(16)
(rss)
新闻分类
(82)
技术·业界(44)
(rss)
其人其事(16)
(rss)
时事政治(22)
(rss)
相册
经典图片
资料图片
收藏夹
(40)
RIA 资料(15)
(rss)
技术资料(14)
(rss)
牛人博客(11)
(rss)
我的连接
CSDN-中国最大的IT技术社区
编程中国
博客园
长大在线
长江大学
我的博客地图
武汉公交网
中华上下五千年
资料源码
code project
codeguru
connectionstrings
devarticles
msdn web cast
sourceforge
VC知识库
程序员联合开发网
罗索工作室
中国协议分析网
中国知网
专注于asp.net源码下载
搜索
积分与排名
积分 - 480195
排名 - 43
最新评论
1. re: 房间手机信号太差,怎么解决?
评论内容较长,点击标题查看
--施卡特
2. re: 友元函数和友元类
还好
--地方
3. re: [转] 网页设计者值得一去的地方!
评论内容较长,点击标题查看
--Check here
4. re: [转] 网页设计者值得一去的地方!
评论内容较长,点击标题查看
--this site
5. re: 友元函数和友元类
@江哲
可以直接访问类的私有变量,无需调用接口函数
--one day
阅读排行榜
1. #ifndef#define#endif的用法(整理)(24844)
2. C#读写INI文件 (19830)
3. 未能加载文件或程序集“CrystalDecisions.CrystalReports.Engine……或它的某一个依赖项(14879)
4. GetQueuedCompletionStatus函数(12715)
5. C# 里面的 #region 是什么意思?(11524)
理解#define和typedef
首先我们来看看下面这个例子:
typedef
int
*
int_ptr;
#define
INT_PTR int *
const
int_ptr p;
//
p不可更改,但p指向的内容可更改
const
INT_PTR p;
//
p可更改,但是p指向的内容不可更改
int_ptr是一种类型(类型本身就是整型指针),const int_ptr p就是把指针给锁住了p不可更改,而const INT_PTR p是const int * p锁的是指针p所指的对象。这些使用常常使我迷惑,所以搜集整理对他们的理解如下:
#define的用法:
1、简单的宏定义
#define
MAXTIME 1000
一个简单的MAXTIME就定义好了,它代表1000,如果在程序里面写:
if
(i
<
MAXTIME)
{
}
编译器在处理这个代码之前会对MAXTIME进行处理替换为1000。
这样的定义看起来类似于普通的常量定义const,但也有着不同,因为define的定义只是简单的替换,而不是作为一个量来使用,这个问题在下面反映的尤为突出。
2、带参数的宏
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
int_ptr int *;
int_ptr a,b;
本意是a和b都是int型指针,但是实际上变成
int
*
a,b;
a是int型指针,而b是int型变量。这时应该使用typedef定义:
typedef
int*
int_ptr;
int_ptr a,b;
这样a和b就都是int型指针了。
3、define的多行定义
define可以替代多行的代码,例如MFC中的宏定义(非常的经典,虽然让人看了恶心)
#define
MACRO(arg1, arg2) do { \
/**/
/*
declarations
*/
\
stmt1; \
stmt2; \
/**/
/*
*/
\
}
while
(
0
)
/**/
/*
(no trailing ; )
*/
关键是要在每一个换行的时候加上一个"\"。
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))
关键是十分容易产生错误,包括机器和人理解上的差异等等。
6、条件编译
#ifdef XXX…(#else) …#endif
例如:
#ifdef DV22_AUX_INPUT
#define
AUX_MODE 3
#else
#define
AUY_MODE 3
#endif
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;
与
#define
int_ptr int *
作用都是用int_ptr代表 int * ,但是二者不同,正如前面所说,#define在预处理时只是进行简单的替换,而typedef不是简单替换 ,而是采用如同定义变量的方法那样来声明一种类型。重复前面的例子:
#define
int_ptr int *
int_ptr a,b;
//
相当于int * a, b; 只是简单的宏替换,a是整型指针,而b之是整型变量
typedef
int
*
int_ptr;
int_ptr a,b;
//
a, b 都为指向int的指针,typedef为int* 引入了一个新的助记符
4、也许您已经注意到#define不是语句,不要在行末加分号,否则会连分号一块置换;但是typedef结束必须加分号,因为它是语句。
posted on 2007-04-17 02:30
谭文政
阅读(1531)
评论(2)
编辑
收藏
引用
所属分类:
基础知识
评论
#
re: 理解#define和typedef
2007-04-22 15:43
heweitykc
兄弟,长大的吗?校友!
回复
更多评论
#
re: 理解#define和typedef
2007-04-23 02:37
苦味酸
@heweitykc
兄弟,你怎么晓得我是长江大学的呢,你是长大哪一届的?我是长大东校区计算机专业的,今年毕业
回复
更多评论
刷新评论列表
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
Win XP系统任务栏实用技巧总集
[转]电子书籍制作工具软件大全
WAV转MP3格式最简单的方法
C#Windows控件的焦点事件顺序
C# 怎么显示中文格式的日期、星期几
[转] 网页设计者值得一去的地方!
Word表格及Excel中斜线表头的绘制方法。
[转] 深入剖析XP的BOOT.INI
什么是uri和url?
存储类说明符:auto,register, extern mutable 和static
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
Powered by:
C++博客
Copyright © 谭文政