前言:
作者简介:爱吃大白菜1132
人生格言:纸上得来终觉浅,绝知此事要躬行
如果文章知识点有错误的地方不吝赐教,和大家一起学习,一起进步!
如果觉得博主文章还不错的话,希望三连支持!
目录
1.预处理符号
2.#define
#define 定义标识符
#define 定义宏
#define 替换规则
3.宏定义中的#和##号的区别
#的作用
##的作用
4.条件编译
__FILE__ //进行编译的源文件
__LINE__ //文件当前的行号
__DATE__ //文件被编译的日期
__TIME__ //文件被编译的时间
__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义
以上预定义符号都是C语言内置的。
语法:#define name stuff
例如:
#include
#define MAX 10int main()
{printf("%d\n", MAX);//打印10return 0;
}
语法:#define name( parament-list ) stuff
注:
参数列表的左括号必须与name紧邻。
如果两者之间有任何空白存在,参数列表就会被解释为stuff的一部分。
#include
#define SUM(a,b) (a)+(b)int main()
{printf("%d\n", SUM(2, 3));return 0;
}
注:
由于宏是通过替换完成的,所以操作符的优先级会影响宏的求值,应该尽量使用括号明确优先级。
在程序中扩展#define定义符号和宏时,需要涉及几个步骤。
1. 在调用宏时,首先对宏中参数进行检查,检查是否包含任何由#define定义的符号。如果有,它们首先被替换。
2. 替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被他们的值所替换。
3. 最后,再次对结果文件进行扫描,看看它是否包含任何由#define定义的符号。如果有,就重复上述处理过程。
加上#后进入宏定义,在预处理时,不会将其改变成参数,而是保留参数所对应的字符串。
#include #define PRINT( VALUE,FORMAT) printf("the value of "#VALUE" is " FORMAT "\n", VALUE);
int main()
{int a = 3;PRINT(a,"%d");//预处理会替换为://printf("the value of a is %d\n", a);
}
##可以把位于它两边的符号合成一个符号。
它允许宏定义从分离的文本片段创建标识符。
//FUC将c和h粘合到一起,相当于字符名ch
#include #define FUC(A,B) A##Bint main()
{char ch[] = "hello world";printf("%s\n", FUC(c,h) );
}
常见的条件编译指令:
1.#if 常量表达式//...#endif//常量表达式由预处理器求值。如:#define __DEBUG__ 1#if __DEBUG__//..#endif
2.多个分支的条件编译#if 常量表达式//...#elif 常量表达式//...#else//...#endif
3.判断是否被定义#if defined(symbol)#ifdef symbol#if !defined(symbol)#ifndef symbol
4.嵌套指令#if defined(OS_UNIX)#ifdef OPTION1unix_version_option1();#endif#ifdef OPTION2unix_version_option2();#endif#elif defined(OS_MSDOS)#ifdef OPTION2msdos_version_option2();#endif#endif