七、预处理
1. 常用预定义符号
__FILE__ //当前编译的文件名 __FUNCTION__ //当前所在函数的函数名 __DATE__ //当前编译日期 __TIME__ //当前编译时间 //以上格式占位符都用%s,如:printf("%s",__DATE__) __LINE__ //当前行数,格式占位符是%d,如:printf("%d",LINE) _CRT_SECURE_NO_WARNINGS //关闭安全检查
2.宏定义
宏定义,又称为宏替换,自定义一个宏(要符合标识符的命名规则),用于替换任意数据、表示符或者表达式。
无参宏定义
基本格式:#define 宏名 宏替换
//例如 #define A 35 //宏A就代表整型数据35 #define TEST asssdj //....代表asssdj #define I int //宏I代表int(相当于给数据类型取别名) //注:不能给宏定义的常量赋值 A = 11; //错误,不能改变宏定义常量的值
宏定义,一改全改
#define ROL 10 #define COL 10 int main() { int arr[ROL][COL] = {1,2,3,4,5}; for (int i = 0; i < ROL; i++) { for (int j = 0; j < COL; j++) { printf("%d ",arr[i][j]); } printf("\n"); } }
3. 带参宏
定义:
#define 宏名(参数列表) 内容
带参宏类型一个函数,带参宏的参数是没有类型的,带参宏没有返回值。
#define FUN(a, b) {printf("%d,%d\n",a,b); printf("%d\n", a+b);} int main() { FUN(10, 10); }
#define F(a,b) A*B int main() { printf("%d\n",F(1+2,2+1)); //输出1+2*2+1=6 }
4. 常量的定义
除了宏定义常量意外,还可以通过const关键字定义常量。
常量必须初始化具体的值,初始化之后不允许被修改。
基本格式:const 数据类型 常量名 = 常量值
const int a = 3; //定义一个常量a,其值=30 a = 40; //错误
定义常量后,值不可以被改变。
5. 宏定义可以是汉字
#define 整型 int #define 字符型 char int main() { 整型 a=10; 字符型 b='a'; }
6. 文件包含
如果想要用库函数就需要包含头文件,也就是文件包含;也可以自己编写自定义头文件。
基本格式:
- #include <stdio.h> ,包含系统头文件<>,只会在系统头文件中找;
- #include <name.h>,自定义头文件,在自定义头文件中找不到再取系统头文件中找;
- 文件包含允许嵌套。
自定义头文件:
//tool.h文件 #ifndif __TOOL_H__ #difine __TOOL_H__ void FUN(); #endif
同时需要配套一个tool.c文件,用于编写FUN()函数具体实现什么东西
#include <tool.h> void FUN() { printf("111\n"); }
在主函数中,需要导入自定义头文件,即可用FUN()函数
#include <stdio.h> #include <tool.h> int main() { FUN(); }
7. 条件编译
即根据不同的条件编译不同的代码块。
#if…#else, 和if…else 差不多
#if 表达式 //表达式为真,则执行if,否则执行else
代码块1;
#else
代码块2;
#endif
另一种
#define A 3 int main() { #ifdef A printf("111\n"); #else printf("000\n"); #endif }