small-fat
in fact , I'm not fat..
导航
C++博客
首页
新随笔
联系
聚合
管理
统计
随笔 - 32
文章 - 0
评论 - 23
引用 - 0
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(6)
给我留言
查看公开留言
查看私人留言
随笔分类
about C++(2)
(rss)
Data Of ACM(19)
(rss)
日记(1)
(rss)
生活(1)
(rss)
之ACM.............(24)
(rss)
之mathematics........(3)
(rss)
随笔档案
2007年8月 (1)
2007年4月 (9)
2006年11月 (1)
2006年10月 (4)
2006年9月 (6)
2006年8月 (10)
2006年5月 (1)
相册
Seeing is believing
My friends
qywyh
(rss)
轻松一刻
原谅一个强奸犯的自白(巨强悍!)
(rss)
最新随笔
1. netbeans中的c++配置
2. Trie数+DP
3. #define的用法
4. pow函数比较不稳定,可以用自定义的pown函数进行计算
5. multimap实现一对多映射
6. 多源最短路径+最小路径覆盖
7. 动态创建二维数组
8. 用链表构造邻接矩阵
9. nlogn的最大上升子序列长度算法
10. 高精度算法
搜索
积分与排名
积分 - 33799
排名 - 596
最新评论
1. re: 高精度算法
评论内容较长,点击标题查看
--郭如君
2. re: 高精度算法
就是用字符串表示一个数,如从1乘到1000,每位数用一个字节表示,负数表示如
-12345,等价于-1,8,7,6,5,5,高位肯定是-1。
--郭如君
3. re: 欧拉函数
初次接触欧拉函数,请教一下:7^d≡1 mod 60,是如何推导d的值为43?
--1111
4. re: 高精度算法
评论内容较长,点击标题查看
--an
5. re: 高精度算法
评论内容较长,点击标题查看
--an
阅读排行榜
1. 扩展欧几里德算法-求解不定方程,线性同余方程(2967)
2. 高精度算法(2719)
3. 多源最短路径+最小路径覆盖(2463)
4. netbeans中的c++配置(2185)
5. ACM深度优先搜索(一题及代码)(1798)
评论排行榜
1. 高精度算法(5)
2. 问题:UnionFindSet(3)
3. 国家队论文(3)
4. 中国vs足球(2)
5. ACM深度优先搜索(一题及代码)(2)
#define的用法
转载:
http://folsailor.bokee.com/6156411.html
#define的用法zz
今天整理了一些#define的用法,与大家共享!
1
.简单的define定义
#define MAXTIME
1000
一个简单的MAXTIME就定义好了,它代表1000,如果在程序里面写
if
(i
编译器在处理这个代码之前会对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))
关键是十分容易产生错误,包括机器和人理解上的差异等等。
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 的注意用法
在这里我们讲讲#define的一些误用,因为上一片已经讲了它的主要作用,这篇主要是一些比较常见的宏陷阱。首先轻松一下。如下的一个经典例子。
#define
private
public
#include
using namespace std;
class c
{
private
:
int
i;
};
int
main()
{
c c1;
c1.i
=
1
;
cout
<
}
#define 竟然让private如此的脆弱,但是却揭示了#define陷阱的根源,它仅仅是代码替换机制而已,除此之外,它什么都不是。
让我们步入正题,来看看下面的一个定义会产生一个什么样的错误?
#define f (x) ((x)
-
1
)
如果这个是一个函数就没有什么问题
int
f (
int
x) { return x
-
1
; }
但是这里是define的世界,f(x)只见出现了一个可怕的空格
使得使得程序中如果出现了
f(
10
)
这个代码,最终就变成了
(
10
) (
10
-
1
)(
10
)这样一个奇怪的东西,当然这个代码倒是无法通过编译,还是可以检查出来的。算是让我们逃过了一次,下次就没有那么幸运了,让我们继续。
#define
abs
(x) x
>
0
? x:
-
x (引用自C语言陷阱与缺陷)
这个代码有什么问题?也许大家也注意到了,我一直在用无数的()来写#define,不是因为我很喜欢()这个东西,而是当我在进行如下的调用的时候。
z
=
abs
(a
-
b)
//
呜呼,这将产生什么东西呢?
答案是:
a
-
b
>
0
? a
-
b :
-
a
-
b
这个显然不是我们要的结果,因为当a
-
b
<
0的时候将返回一个
-
a
-
b,要解决这个问题,我们就要使用()来解决。
#define
abs
(x) (x)
>
0
? (x):
-
(x)
现在这个代码就可以正常的工作了。只要我们紧记#define是代码替换的机制,不要对它有任何的奢求,就会避免上面的问题。另外,因为宏不是一个类型,没有数据安全检查,在调试的时候也会产生障碍,所以,C
++
就一直提倡使用const和inline来替换#define,也许,#define真的会在历史的舞台上消失,但define在C语言时代留下的功绩却不应该忘记。
来自 http:
//
community.csdn.net
/
Expert
/
topic
/
3195
/
3195102
.xml?temp
=
.
3936731
posted on 2007-04-18 23:53
small-fat
阅读(1301)
评论(1)
编辑
收藏
引用
所属分类:
about C++
Comments
#
re: #define的用法
Achigo
Nice
Posted @ 2007-06-27 15:45
回复
更多评论
刷新评论列表
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
netbeans中的c++配置
#define的用法
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理