一定要define吗

ding_suki 2007-06-07 05:42:13
各位,我看到代码里很多#define ......的
#define A 1
#define B 2
...
#define C 1
#define D 2
请问为什么可以重复宏定义一个变量为同一个数?
...全文
347 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
lemonmk2 2007-06-09
  • 打赏
  • 举报
回复
同意楼上的!
如果在代码中有多次修改一个数据的地方,#define了会非常方便且安全。
___NULL 2007-06-09
  • 打赏
  • 举报
回复
#define 这个东西很好用
修改程序方便,被多次引用的情况下,也只需要修改一个地方。
dai_weitao 2007-06-09
  • 打赏
  • 举报
回复
方便阅读代码的.
浪客 2007-06-09
  • 打赏
  • 举报
回复
用define便于维护。
比如
#define MAX 255
当你要修改这个数字的时候只需要改这一处就相当于修改了所有使用这个MAX的地方,要不还得挨个找到在修改。

这只是它的作用之一。
milksea 2007-06-09
  • 打赏
  • 举报
回复
为什么要用宏定义,上面的已经说清楚了。补充一点别的。

经常看到熟悉C++的人写一些对C++是对的但对C是不对的东西。注意到在C语言中const变量并不是真正的常量,而只不过是限制程序员写的变量,所以一些整数常量还是应该用宏定义,或如chenyu2202863所说,写成枚举(enum)。

考虑下面的代码:
int buffer[4096];
其中4096是一个magic number,一般地应该定义一个符号常量,以增加可读性,并方便后面的相关代码的修改。使用宏的代码是:
#define BUFFERSIZE 4096
int buffer[BUFFERSIZE];
但由于宏的不安全性,反对宏的人则建议写成:
enum { BUFFERSIZE = 4096 };
int buffer[BUFFERSIZE];
以上两种做法都是习见的,可行的。

但是,在C中,下面的代码是错误的:
const unsigned BufferSize = 4096;
int buffer[BufferSize];
因为前面说过,const变量还是变量,并不是真正的常量。
与之不同的是,在C++中上面的代码就是正确的(这可算是C++对C的改进之一),这点应该引起注意。
星羽 2007-06-09
  • 打赏
  • 举报
回复
inline Matrix4 operator * ( const Matrix4 &m2 ) const
Matrix4 r;
r.m[0][0] = m[0][0] * m2.m[0][0] + m[0][1] * m2.m[1][0] + m[0][2] * m2.m[2][0] + m[0][3] * m2.m[3][0];
r.m[0][1] = m[0][0] * m2.m[0][1] + m[0][1] * m2.m[1][1] + m[0][2] * m2.m[2][1] + m[0][3] * m2.m[3][1];
r.m[0][2] = m[0][0] * m2.m[0][2] + m[0][1] * m2.m[1][2] + m[0][2] * m2.m[2][2] + m[0][3] * m2.m[3][2];
r.m[0][3] = m[0][0] * m2.m[0][3] + m[0][1] * m2.m[1][3] + m[0][2] * m2.m[2][3] + m[0][3] * m2.m[3][3];

r.m[1][0] = m[1][0] * m2.m[0][0] + m[1][1] * m2.m[1][0] + m[1][2] * m2.m[2][0] + m[1][3] * m2.m[3][0];
r.m[1][1] = m[1][0] * m2.m[0][1] + m[1][1] * m2.m[1][1] + m[1][2] * m2.m[2][1] + m[1][3] * m2.m[3][1];
r.m[1][2] = m[1][0] * m2.m[0][2] + m[1][1] * m2.m[1][2] + m[1][2] * m2.m[2][2] + m[1][3] * m2.m[3][2];
r.m[1][3] = m[1][0] * m2.m[0][3] + m[1][1] * m2.m[1][3] + m[1][2] * m2.m[2][3] + m[1][3] * m2.m[3][3];

r.m[2][0] = m[2][0] * m2.m[0][0] + m[2][1] * m2.m[1][0] + m[2][2] * m2.m[2][0] + m[2][3] * m2.m[3][0];
r.m[2][1] = m[2][0] * m2.m[0][1] + m[2][1] * m2.m[1][1] + m[2][2] * m2.m[2][1] + m[2][3] * m2.m[3][1];
r.m[2][2] = m[2][0] * m2.m[0][2] + m[2][1] * m2.m[1][2] + m[2][2] * m2.m[2][2] + m[2][3] * m2.m[3][2];
r.m[2][3] = m[2][0] * m2.m[0][3] + m[2][1] * m2.m[1][3] + m[2][2] * m2.m[2][3] + m[2][3] * m2.m[3][3];

r.m[3][0] = m[3][0] * m2.m[0][0] + m[3][1] * m2.m[1][0] + m[3][2] * m2.m[2][0] + m[3][3] * m2.m[3][0];
r.m[3][1] = m[3][0] * m2.m[0][1] + m[3][1] * m2.m[1][1] + m[3][2] * m2.m[2][1] + m[3][3] * m2.m[3][1];
r.m[3][2] = m[3][0] * m2.m[0][2] + m[3][1] * m2.m[1][2] + m[3][2] * m2.m[2][2] + m[3][3] * m2.m[3][2];
r.m[3][3] = m[3][0] * m2.m[0][3] + m[3][1] * m2.m[1][3] + m[3][2] * m2.m[2][3] + m[3][3] * m2.m[3][3];

return r;
chenyu2202863 2007-06-09
  • 打赏
  • 举报
回复
当然你还可以用enum{A=1,B=2,C=1,D=2};
justicesun 2007-06-09
  • 打赏
  • 举报
回复
目的是在改的时候更容易点
cgwshxs 2007-06-09
  • 打赏
  • 举报
回复
用define和const定义的是常量哈
millky 2007-06-07
  • 打赏
  • 举报
回复
polarislee的解释完美。是这样的:
1、这个预定义纯粹为了程序的易读性着想的;
2、如果在C++里,这是不科学的方法,应该用const代替#define来进行这方面的预定义,具体原因见effective c++(3rd)条款二。
希望能对你有所帮助!
ding_suki 2007-06-07
  • 打赏
  • 举报
回复
好的,明白点了,谢谢!
freshui 2007-06-07
  • 打赏
  • 举报
回复
定义成啥都无所谓
编译器在预编译的时候把所有A都替换成了1
同理, 所有C也都替换成1了
然后再把替换后的代码交给编译器去编译
这样你定义的A和C对编译器来说, 根本就不知道有这玩意

所以怎么define都无所谓
shubing820904 2007-06-07
  • 打赏
  • 举报
回复
是一个好的习惯!
shubing820904 2007-06-07
  • 打赏
  • 举报
回复
在C++中建议你还是用 CONST 比较好啊!#define是为了避免你重复使用, 加#define
ding_suki 2007-06-07
  • 打赏
  • 举报
回复
我的意思是,为什么定义1既可以宏定义为A,同时定义为C?
ding_suki 2007-06-07
  • 打赏
  • 举报
回复
我是用KEIL C编译,如果我不DEFINE的话就有警告
BaiYangSpirit 2007-06-07
  • 打赏
  • 举报
回复
宏定义,需要的时候就定义了,让别人阅读代码方便罢了
北极猩猩 2007-06-07
  • 打赏
  • 举报
回复
不一定费用#define,推荐使用const
比如
const int A=1;


请问为什么可以重复宏定义一个变量为同一个数?
就像你给两个变量赋值成同一个值是一样的
  • 打赏
  • 举报
回复
容易记忆,当然这种情况可以完全不需要define
freshui 2007-06-07
  • 打赏
  • 举报
回复
因为用A B C D
很容易让你阅读程序

对计算机来说define不define都一样

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧