宏定义发生在预编译阶段,简单的说本质就是文本替换。使用时,有以下注意事项:
1,用宏定义表达式时,要使用完备的括号
如一下三个例子:
#define ADD(a,b) a+b
#define ADD(a, b) (a + b)
#define ADD(a, b) (a) +(b)
这三种定义,全部都是不符合要求的。陷阱如下:
在计算ADD(a,b)*ADD(c,d)时,显然第一种出问题了。
#define MULTIPLE(a, b) (a*b) 在计算(a+b)*c时,调用MULTIPLE(a+b,c)得到的结果错误。
因此一定要使用完备的括号,如下示例:
#define ADD(a,b) ((a) + (b))
2,使用宏定义,不允许参数发生变化,这也就是带参数的宏定义和函数的区别:
如下测试源码:
#include <stdio.h>
#define sqrt(a) ((a)*(a))
int fsqrt(int a)
{
return a*a;
}
int main()
{
int a = 10, b = 10;
int r1, r2;
r1 = sqrt(a++);
r2 = fsqrt(b++);
printf("a = %d, b = %d, r1 = %d, r2 = %d\n", a, b, r1, r2);
return 0;
}
最终的结果是a = 12; b = 11; r1 = 100; r2 = 100; 以上结果在vc6.0下获得。之所以a变成12,是因为在替换的时候,a++被执行了两次。要避免这种行为,就要使宏参数不发生变化。
如:a++; r1 = sqrt(a), 一切就ok了!
3,使用大括号将宏定义包含的多条表达式括起来。
如下示例:
#include <stdio.h>
#define INITIAL(a, b)\
a = 0;\
b = 0;
int main()
{
int a[5], b[5] ;
int i;
for(i=0; i<5; i++)
INITIAL(a[i], b[i]);
printf("a = %d, b = %d\n", a[0], b[0]);
return 0;
}
结果打印a是正常的,但打印b却是未初始化的结果。因为简单的文本替换,不能保证多条表达式都放到for循环体内。(这里,如果单独初始化一个变量,没有for循环时没有问题的。)上述的宏定义应改为:
#define INITIAL(a, b)\
{\
a = 0;\
b = 0;\
}
注意这个“\”号哦,表示下面的一行和当前行在预编译时被认为在同一行。
最后,再简单对比下#define和 typedef的区别,#define发生在预编译阶段, typedef发生在编译阶段,可参考http://topic.csdn.net/t/20030810/14/2129718.html。更多细节上的区别,稍后再谈。
不对之处,大家多指正。
分享到:
相关推荐
#define 问题 用法陷阱
#define MAXLEN 201 #define LEN 1 #define SPEED1 50 #define SPEED2 100 #define SPEED3 200 #define FOOD1_S1 5 #define FOOD1_S2 10 #define FOOD1_S3 15 #define FOOD2_S1 10 #define FOOD2_S2 20 #define FOOD...
是a+b 然后去和c,d 相乘,但是因为使用了define(它只是一个简单的替换),所以式子实际上变成了 c*a + b*d 另外举一个例子: #define pin (int*); pin a,b; 本意是a 和b 都是int 型指针,但是实际上变成int* a,b; ...
介绍#define和typedef的区别于使用
题目:宏#define命令练习(1) 1.程序分析:2.程序源代码:#include "stdio.h"#define TRUE 1#define FALSE 0#define SQ(x) (x)*(x)void main(){int num;int again=1;printf("\40: Program will stop if input value ...
主要是#ifndef和#define的用法说明,并举例说明便于理解。
const #define inline的用法及区别
#ifndef #define #endif的用法
用C语言实现的 预编译器中——#include和#define 操作
1602液晶显示的底层驱动c程序,#define DataDir P4DIR #define DataPort P4OUT #define Busy 0x80 #define CtrlDir P5DIR #define CLR_RS P5OUT&=~BIT5; //RS = P5.5 #define SET_RS P5OUT|=BIT5; #define CLR...
使用场合:拼接两个宏,一个是传入的宏。但是传入的宏不会被替换,反而原封不动的接了上去,这就尴尬了。经过各种尝试,居然成了,特此记录分享一下,方便大家学习。 char A_param=0; char B_pramm=0; //添加宏定义...
#define XBYTE ((unsigned char volatile xdata *) 0) 定义 XBYTE 为 指向 xdata 地址空间unsigned char 数据类型的指针,指针值为0 这样,可以直接用XBYTE[0xnnnn]或*(XBYTE+0xnnnn)访问外部RAM了。
写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性 等等。下面列举一些成熟软件中常用得宏定义……
C语言中宏定义#define用法总结 1.简单的宏定义 2.带参数的宏 3.宏的特殊单行定义
NULL 博文链接:https://jacky-dai.iteye.com/blog/868385
The #define Directive You can use the #define directive to give a meaningful name to a constant in your program. The two forms of the syntax are: Syntax #define identifier token-stringopt #...
介绍C++/C 宏定义(define)中# ## 的含义, 并以C++代码举例说明
#define是预处理指令 typedef是在编译时处理的 typedef与#define的区别
#indef 与#define 区别于用法,很详细的解数哦!
C、C++语言中的“#define” 宏定义的一些用法总结,很好的资料