预定义符号
-FILE- 进行编译的源文件
-LINE- 文件当前的行号
-DATE- 文件被编译的日期
-TIME- 文件被翻译的时间
这些预定义符号都是语言内置的。
#define
使用define指令,你可以把任何文本替换到程序中。
eg:
#define reg register //简短的别名使各个声明更容易通过制表符进行排列
#define do_forever for(;;) //用更具描述性的符号来代替一种用于实现无限循环
#define CASE break;case //简短记法,以便在switch中使用
#define 定义标识符
#define name stuff //若stuff非常长,它可以分成几行,除了最后一行外,每行的末尾都要加一个反斜杠。
#define 定义宏
#define SQUARE( x ) x * x
SQUARE( 5 )
int a = 5;
printf("%d\n" ,SQUARE( a + 1) );
//实际输出情况printf (“%d\n”,a + 1 * a + 1 );打印11
#define SQUARE(x) (x) * (x)
//避免上述问题 打印36
总结:所有用于对数值表达式求值的宏定义都应该用这种方式加上括号,避免在使用宏时,由于参数中的操作符或邻近的操作符之间不可预料的相互作用。
# 用于将参数插入到字符串中
#define PRINT(x)
printf("the value of "#x" is %d",x)
int main()
{
int b=0;
p
PRINT(b);
}
输出 The value of x is 0
##把位于它两边的符号连接成一个符号
```
#define ADD_TO_SUM(sum_number,value)\
sum##sum_number+=value
...
ADD_TO_SUM(5,25)
把值25加到变量sum5,输出30。
带副作用的宏参数
x+1 //重复执行,每次获得结果一样,不具副作用
x++ //表达式执行下一次时,将产生不同的结果,具有副作用
#define MAX(a,b) ((a)>(b)?(a):(b))
...
x=5;
y=8;
z=MAX(x++,y++);
printf("x=%d,y=%d,z=%d\n",x,y,z);
输出 x=6 y=10 z=9
析:宏替换后
z=((x++)>(y++)?(x++):(y++)
y第一次增值是在比较时,第二次增值是在执行?符号后面的表达式时出现。
条件编译
头文件的开头写
#ifndef __TEST_H__
#define __TEST_H__
//头文件的内容
#endif //__TEST_H__
避免头文件的重复引入