第16节 宏定义与使用分析

-------------------------------------资源来源于网络,仅供自学使用,如有侵权,联系我必删.

第一:

定义宏常量

可以定义常量和路径

 

定义宏表达式

? #define 表达式给有函数调用的假象 , 却不是函数
? #define 表达式可以比函数更强大
? #define表达式比函数更容易出错

 

#include <stdio.h>

#define SUM(a,b)    (a)+(b)
#define MIN(a,b)    ((a)<(b) ? (a):(b))
//检测数组有多少元素 
#define DIM(array)  (sizeof(array)/sizeof(*array) )

int main()
{
    int i =1;
	int j =5;	
	int a[] = {1,2,3} ; 
	
    printf ("%d\n",SUM(1,2) * SUM(1,2));//1+2 * 1+2
    printf ("%d\n",MIN(i++,j));// (i++<j)?(i++):(j)
    printf ("%d\n",MIN(++i,j));// (++i<j)?(++i):(j)
    printf ("%d\n",DIM(a));
   
   return 0;
}

 

 

第二:

宏代码块的定义
宏强于函数的优势

#include <stdio.h>
#include <malloc.h>

#define MALLOC(type, x) (type*)malloc(sizeof(type)*x)
#define FOREVER() while(1)

#define BEGIN {
#define END   }
#define FOREACH(i, m) for(i=0; i<m; i++)

int main()
{
    int array[] = {1, 2, 3, 4, 5};
    int x = 0;
    int*p = MALLOC(int, 5);
    
    FOREACH(x, 5)  //动态数组赋值
    BEGIN
        p[x] = array[x];
    END
    
    FOREACH(x, 5)
    BEGIN
        printf("%d\n", p[x]);
    END
    
    FOREVER();    //死等
    
    free(p);
    
    printf("Last printf...\n");
    
    return 0;
}

 

 

第三:

?  宏表达式在预编译期被处理 , 编译器不知道宏表达式的存在
?  宏表达式用“ 实参” 完全替代形参 , 不进行任何运算
?  宏表达式没有任何的“ 调用” 开销
? 宏表达式中不能出现递归定义

 

第四:

宏定义的常量或表达式没有有作用域限制

#include <stdio.h>

int f1(int a, int b)
{
    #define _MIN_(a,b) ((a)<(b) ? a : b)
    
    return _MIN_(a, b);
}

int f2(int a, int b, int c)
{
    return _MIN_(_MIN_(a,b), c);
}

int main()
{
    printf("%d\n", f1(2, 1));
    printf("%d\n", f2(5, 3, 2));
    
    return 0;
}

 

 

使用#undef时:

 

 

第五:

其他宏

 

#include <stdio.h>
#include <time.h>

#define  LOG(s)  do{            		  		    \     
			time_t t;			    		     	\	  
			struct tm* ti;	  				    	\		  
			time(&t);	 							\		  
			ti = localtime(&t);		 		 	    \
  printf("%s[%s:%d] %s\n",asctime(ti),_FILE_,LINE_,s);		    \
}while(0)

void f()
{
	LOG("Enter f()...");
	LOG("Exit  f()...");
}

int main()
{
    LOG("Enter main()...");
    f();
    LOG("Enter main()...");
 
 	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值