目录
一、 预定义符号
ANSI C定义了一些预定义符号,它们表示不同含义
FILE :进行编译的源文件名
LINE :文件当前行号
DATE :文件被编译日期
TIME :文件被编译时间
STDC :如果编译器遵循ANSI C 其值为1,否则未定义
二、#define 宏定义
#define是 C语言 和 C++ 中的一个预处理指令,其中的“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令,“define”为宏定义命令
2.1 定义不带参数的宏
用法:
#define 标识符(宏名) 对应值
作用:在预编译时,将标识符替换为对应值,对应值可以是任何文本内容
例如:
#define int_t int //对关键字int起了一个别名,注意int_t不是类型,只是会替换为int
#define do_forever for(;;) //用do_forever描述了一个无限for循环
注意:不应该在宏定义的尾部加上分号
例一
#define MAX 10;
int x = MAX; ; //预编译后替换为: int x = 10;
//可以发现第二个;表示一条空语句,这种场景不会出错
例二
#define MAX 10;
int y = 10;
int x = 0;
if(y >= 10)
x = MAX; //预编译后替换为: x = 10;; if没有加{ },后面不能跟两条语句,出错
else
x = 20;
2.2 定义带参数宏
用法:
#define name(parameter-list) stuff
作用:在预编译时,将传入参数列表中参数替换到宏体中对应参数执行某些操作
name :宏名
parameter-list:参数列表
stuff:宏体
注意:参数列表的左括号必须与name紧邻,如果两者之间有任何空白存在,参数列表和宏体会被当作不带参数的宏中的替换值
2.3 宏的替换规则
在程序中使用宏时,需要涉及几个步骤。
在调用宏时,首先对参数进行检查,看看是否包含任何由#define定义。如果是,它们首先被替换。
替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被他们的值所替换。
最后,再次对结果文件进行扫描,看看它是否包含任何由#define定义的符号。如果是,就重复上述处理过程。
#define MAX 100
#define DOUBLE(X) ((X) + (X))
int main()
{
/*
调用宏首先对参数检查,由于参数MAX是#define定义,所以被替换即: int n = DOUBLE