周二是一个好日子,可以睡个懒觉.睡到中午看了会球赛,晃到学校无事做,想到 最近看得代码里面有关于#define的高级用法,刚看得时候很不明白,上网找关于#define的用法,网上讲的都不是很明白,而且基本上都是那一个文章被四处转载,那就写一篇关于#define的专题文章吧
1基本用法
老套路,#define最基本的用法就是定义常量,如#define pi 3.14159 这样就用pi代替了3.14159这个值,这样做得好处是程序清楚,易懂,修改方便.这只是简单的文本替换,不在堆栈上分配内存空间,在c++中有const标示,也可以定义常量,这里定义的常量是有数据类型的,在内存堆栈上分配空间,个人感觉两者在定义常量的用法上不太一样,简单的常量定义用const好一点,因为毕竟现在的程序对内存的需求不是很严,但是对于我们现在用的c在驱动开发中还是用的#define.
2代参数的宏定义
大家讲得已经很多了,无非是注意层次问题因为#define只是简单的文本替换,所以要注意括号的问题.
还有几个关于#define的高级特性大家可以了解一下,
## 代表连接字符 比如 #define A(x) A##x
A(1)则年表示 A1;
#表示在字符串中表示变量
如
#define IF_JUDGE(x) if(t == x) OutputDebugString("x/n");
为了使IF_JUDEG(100) 输出为100。 应改为#define IF_JUDGE(x) if(t == x) OutputDebugString(#x"/n");
#@则是微软特定的宏定义 因该是加上单引号;不建议使用
另外#define的定义可以加上反斜线这样可以接很多行代码;
下面我举一个例子说明一下用#define的好处
#define openport(num)/
static void openport##num{
ser_port *pPort;
/*一些操作*/
}
openport(1);
openport(2);
openport(3);
openport(4);
...
switch(slot)
case1:
openport1;
break;
case 2:
openport2;
break;
case 3:
openport3;
break;
case 4:
openport4;
break;
default:
break;
上面代码什么作用呢?就是声明了四个openport函数,这样就不用声明四个基本相同的函数了;
这是本人的一点拙见,欢迎高手指点
1基本用法
老套路,#define最基本的用法就是定义常量,如#define pi 3.14159 这样就用pi代替了3.14159这个值,这样做得好处是程序清楚,易懂,修改方便.这只是简单的文本替换,不在堆栈上分配内存空间,在c++中有const标示,也可以定义常量,这里定义的常量是有数据类型的,在内存堆栈上分配空间,个人感觉两者在定义常量的用法上不太一样,简单的常量定义用const好一点,因为毕竟现在的程序对内存的需求不是很严,但是对于我们现在用的c在驱动开发中还是用的#define.
2代参数的宏定义
大家讲得已经很多了,无非是注意层次问题因为#define只是简单的文本替换,所以要注意括号的问题.
还有几个关于#define的高级特性大家可以了解一下,
## 代表连接字符 比如 #define A(x) A##x
A(1)则年表示 A1;
#表示在字符串中表示变量
如
#define IF_JUDGE(x) if(t == x) OutputDebugString("x/n");
为了使IF_JUDEG(100) 输出为100。 应改为#define IF_JUDGE(x) if(t == x) OutputDebugString(#x"/n");
#@则是微软特定的宏定义 因该是加上单引号;不建议使用
另外#define的定义可以加上反斜线这样可以接很多行代码;
下面我举一个例子说明一下用#define的好处
#define openport(num)/
static void openport##num{
ser_port *pPort;
/*一些操作*/
}
openport(1);
openport(2);
openport(3);
openport(4);
...
switch(slot)
case1:
openport1;
break;
case 2:
openport2;
break;
case 3:
openport3;
break;
case 4:
openport4;
break;
default:
break;
上面代码什么作用呢?就是声明了四个openport函数,这样就不用声明四个基本相同的函数了;
这是本人的一点拙见,欢迎高手指点