关于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)   下面举个实际的例子包含这个宏定义探究一下

关于C语言宏定义define的用法探究

这种情况下,在预处理的时候程序将第12行直接替换成 result = (x) > (y) ? (x) : (y);结果毫无疑问是没问题的,但是要是我把程序改为这样?

关于C语言宏定义define的用法探究

这个时候预处理的时候是这样处理的  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用来定义一个简单函数功能:

关于C语言宏定义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替换为其值并加上“”。

以上是三个特殊用法。

   6.在大规模的开发过程中,特别是跨平台和系统的软件里,define最重要的功能是条件编译。
   #ifdef WINDOWS
   ......
   ......
   #endif
   #ifdef LINUX
   ......
   ......
   #endif
   可以在编译的时候通过#define设置编译环境
   7.取消宏
   #undef 标识符
   8.条件编译
   #ifdef XXX…(#else) … #endif 
   9.预定义宏
   在C语言中收录了一些有用的宏,这些宏是提供当前编译信息的。
   __LINE__        被编译文件的行数
  (整型)
   __FILE__  被编译文件的名字 (字符型)
   __DATE__  编译日期 (字符型)
   __TIME__  编译时间 (字符型)
   __STDC__  如果编译器接受标准C,那么值为1. (整型)
 
   通常我们在编译的时候我们可以用这些预定义的宏来进行排错,例如:
   一般情况下,当出现除零的情况时编译器是没有提示的,我们可以自定义一个解决办法。
   #define CHECKZERO(divisor)\
   if(divisor==0)\
   printf("***ATTEMPT TO DIVIDE BY ZERO IN LINE %d of file %s ***\n",__LINE__,__FILE__);\
 
 
   引用方法
   CHECKZERO(j);
   k=i/j;