1、#define定义宏常量可以出现在代码的任何地方
2、#define从本行开始,之后的代码都可以使用这个宏常量
3、#define表达式给有函数调用的假象,却不是函数
4、#define表达式可以比函数更强大
5、#define表达式比函数更容易出错
6、宏表达式与函数的对比
·宏表达式在预编译期被处理,编译器不知道表达式的存在
·宏表达式用“实参”完全替代形参,不进行任何计算
·宏表达式没有任何的“调用”开销
·宏表达式中不能出现递归定义
#define FAC(n) ((n>0) ? (FAC(n-1)+1) : 0)
int j = FAC(100);
7、gcc -E test.c -o test.i
gcc -S test.i -o test.s
gcc -C test.s -o test.o
8、int f1(int a, int b)
{
#define _MIN_(a,b) ((a)<(b) ? a : b)
return _MIN_(a,b);
#undef _MIN_
}
9、强大的内置宏
宏 含义
_FILE_ 被编译的文件名
_LINE_ 当前行号
_DATE_ 编译时的日期
_TIME_ 编译时的时间
_STDC_ 编译器是否遵循标准C规范
10、time_t t;
struct tm* ti;
time(&t);
ti = localtime(&t);
printf ("%s", asctime(ti)); //显示当前系统时间
11、#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)
2、#define从本行开始,之后的代码都可以使用这个宏常量
3、#define表达式给有函数调用的假象,却不是函数
4、#define表达式可以比函数更强大
5、#define表达式比函数更容易出错
6、宏表达式与函数的对比
·宏表达式在预编译期被处理,编译器不知道表达式的存在
·宏表达式用“实参”完全替代形参,不进行任何计算
·宏表达式没有任何的“调用”开销
·宏表达式中不能出现递归定义
#define FAC(n) ((n>0) ? (FAC(n-1)+1) : 0)
int j = FAC(100);
7、gcc -E test.c -o test.i
gcc -S test.i -o test.s
gcc -C test.s -o test.o
8、int f1(int a, int b)
{
#define _MIN_(a,b) ((a)<(b) ? a : b)
return _MIN_(a,b);
#undef _MIN_
}
9、强大的内置宏
宏 含义
_FILE_ 被编译的文件名
_LINE_ 当前行号
_DATE_ 编译时的日期
_TIME_ 编译时的时间
_STDC_ 编译器是否遵循标准C规范
10、time_t t;
struct tm* ti;
time(&t);
ti = localtime(&t);
printf ("%s", asctime(ti)); //显示当前系统时间
11、#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)