此次分享的是预处理相关的知识,如有错误,请指出。
1.预定义符号
__FILE__ //进行编译的源文件
__LINE__ //文件当前的行号
__DATE__ //文件被编译的日期
__TIME__ //文件被编译的时间
如:
printf("file:%s\tline:%d\tdata:%s\ttime:%s\n",__FILE__,__LINE__,DATE__,__TIME__);
这样就可以输出当前编译文件的相关信息了。
2.#define
#define name stuff
有了这条指令,每当有符号name出现在指令后面时,预处理器就会把它替换成stuff.
替换文本并不仅限于数字字面常量,还可以把任何文本替换到程序中。
如:
#define reg register //为register这个关键字,创建一个简短的名字
2.1宏
#define机制允许把参数替换到文本中, 这种实现通常称为宏或定义宏(宏函数)。
定义格式为:
#define name (parament-list) stuff
如:
#define SQUARE(x) ((x)*(x))
这个宏函数接受一个参数。如果在上述声明之后,你把SQUARE(10)置于程序中,预处理器就会用已下表达式替换上面的表达式:
10 * 10
注意:
所用用于对数值表达式进行求值的宏定义,不仅要对参数带上括号,也要给运算整体带上括号。避免在使用宏函数时由于参数中的操作符或
邻近操作符之间不可预料的相互作用。
2.2#define定义符号和宏,替换的过程
涉及⼏个步骤。
1、在调⽤宏时,⾸先对参数进⾏检查,看看是否包含任何由#define定义的符号。如果是,它们⾸先被替换。
2、替换⽂本随后被插⼊到程序中原来⽂本的位置。对于宏函数,参数名被他们的值替换。
3、最后,再次对结果⽂件进⾏扫描,看看它是否包含任何由#define定义的符号。如果是,就重复上述处理过程。
2.3扩展
如果想让宏进行输出,使其具有输出特性,可以使用以下技巧。
1.邻近字符串连接特性。这个特性可以使我们很容易把⼀个字符串分成⼏段。
#define M 9
#define PRINT( FORMAT, VALUE) \
printf("the value is " FORMAT"\n" , VALUE);
PRINT("%d" ,M);
2.使⽤预处理器将⼀个宏参数转换为⼀个字符串。(#VALUE 这种结构被处理器翻译为"VALUE")
#define M 9
#define PRINT( FORMAT, VALUE ) \
printf("the value of " #VALUE" is " FORMAT"\n", VALUE);
PRINT("%d" ,M);
3.##结构则执⾏⼀种不同的任务。它把位于它两边的符号连接成⼀个符号。
作为⽤途之⼀,它允许宏定义从分离的⽂本段创建标识符。
如:
#define STR1 "aa"
#define STR2 "bb"
#define STR1STR2 "welcome"
#define CAT(STR1,STR2) STR1##STR2
int main()
{
printf("%s\n" ,CAT(STR1,STR2));
return 0;
}
结果是: welcome