关于C语言宏定义define的用法探究
C语言中,我们常用#define 来完成宏定义,比如#define N 10 的意思是 给N指定一个值 10,而且在代码预处理之后是直接替换。下面就来具体探讨一下define的用法把。
1、最直接的用法定义一个常量:
如:#define MAX 1000 当在后面的程序中使用到MAX的时候,会在预编译的时候傻瓜式的替换为1000,这个时候一般不会出现什么问题。
2、定义一个表达式:
如:#define MAX(x,y) (x>y?):(x):(y) 下面举个实际的例子包含这个宏定义探究一下
这种情况下,在预处理的时候程序将第12行直接替换成 result = (x) > (y) ? (x) : (y);结果毫无疑问是没问题的,但是要是我把程序改为这样?
这个时候预处理的时候是这样处理的 result = m * (x) > (y) ? (x) : (y); 这样的结果就变成了50 > 6? 5:6;结果就是5,不信的筒子可以试试哦,这里就不贴图了。。。只是强调一下这个问题,define只能完成简单的替换,这在下面的例子还有体现。
3、define用来宏定义数据类型:
如#define INT int 由于是简单的替换,这样写出INT a = 10;也就相当于int a = 10;所以没什么问题。
但是!但是!如果有指针存在的情况下呢?比如 #define PINT (int*) 这样写出的PINT pa,pb;直接替换就相当于int* pa,pb; 这样pa是整形指针,而pb只是一个普通的整形。这个时候应该使用typedef。具体见本人的typedef篇。
4、define用来定义一个简单函数功能:
例如上面的程序,利用define定义了多行语句,只需要用\来换行就可以了。
5、define的一些特殊语法:
a、#define A(x) T_##x A(1) 替换为 T_1 这个时候##的意思是将后面的x粘在前面的符号之后。
b、#define B(x) #@x B(1) 替换为 '1' 这个时候#@的意思是将x替换为值并加上''。
c、#define C(x) #x C(1) 替换为 “1” 这个时候#的意识是将x替换为其值并加上“”。
以上是三个特殊用法。