-------------------------------------资源来源于网络,仅供自学使用,如有侵权,联系我必删.
第一:
定义宏常量
可以定义常量和路径
定义宏表达式
? #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;
}