预处理命令与符号
/*
预处理命令:以#号开头,只做文本替换,不做语法判断
不是c语句,不需要在行末加‘;’,符号名要使用大写
预定义符号:__FILE__ ;__LINE__ ;__DATE__ ;__TIME__
宏定义:#difine 符号名 表达式
#undef 符号名 //终止之前定义宏
符号常量的定义:
*/
#include <stdio.h>
#define NAME name
#define LEN 20
int main(void)
{
//printf("%s",__FILE__);
char name[LEN]="hello";
printf("%s\n",name);
for (int i=0; i<LEN; i++) {
putchar(name[i]);
}
#undef LEN //终止之前定义宏
#define LEN 20
int arr[20]={1,2,3,4};
return 0;
}
#undef LEN;
带参宏
/*
带参宏:使用宏定义模拟函数
#define 宏名(参数表)字符串
在宏定义的所有参数都使用“()”,宏定义的整体也使用“()”;
优点:能够使代码清晰,没有现场保护,没有函数调用过程
缺点:只适用于比较简短的代码,不要使用宏替换递归调用函数
*/
#include <stdio.h>
#define swap(a,b) {int t=0;t=a;a=b;b=t;}
int main(void)
{
int a=4,b=5;
printf("%d %d\n",a,b);
swap(a,b);
printf("%d %d\n",a,b);
return 0;
}
//输入两个值,输出两个值的和
#include <stdio.h>
#define SUM(A,B) ((A)+(B))
#define MIN(A,B) ((A)<(B)?(A):(B))
int min(int a,int b)
{
return a<b?a:b;
}
int main(void)
{
int sum,a=4,b=5;
printf("%d %d\n",a,b);
int c=SUM(a,b);
printf("sum=%d\n",c);
printf("Macro min: %d\n",MIN(a,b=3)); //先替换在执行
printf("Fun min:%d\n",min(a,b=3)); //先求值后调用
return 0;
}
使用命令行定义宏
/*
使用命令行定义宏
-Dname
-Dname=value
gcc -DLEN=10 demo058.c 指定宏定义LEN的值
*/
#include <stdio.h>
int main(void)
{
int a[LEN];
printf("%d\n",LEN);
return 0;
}
条件编译
/*
预处理时根据条件加载部分代码
条件编译
#if 条件1
#elif 条件2
#elif 条件3
#else
#endif
1. #ifdef 宏名
.........
#else
.........
#endif
2.#ifndef 宏名
.........
#endif
//处理重复包含问题
*/
/*
#include <stdio.h>
//#define DEF 0
int main(void)
{
#if DEF
printf("条件编译\n");
#else
printf("else\n");
#endif
return 0;
}
*/
//若有宏定义circle,求圆面积,若没有定义,求正方形的面积
#include <stdio.h>
int main(void)
{
int r=1;
#if CIRCLE
#define PI 3.14
double s=PI*r*r;
#else
double s=r*r;
printf("%f\n",s);
return 0;
}
标准函数库与本地文件包含
/*
#include <stdio.h> //标准函数库文件包含(gcc编译器默认的查找路径,PATH)
#include"path" //本地文件包含(gcc编译器首先在当前指定目录path下查找,若没有找到继续到PATH中查找)
*/
#include "demo060.h"
int main(void)
{
int a[10];
input(a,10);
output(a,10);
return 0;
}