本文共 3328 字,大约阅读时间需要 11 分钟。
上一篇文章:
比如:#define PI 3.14
s=PI*r*r;
计算时用3.14代替PIs=3.14*r*r;
用3.14替换掉PI就是宏展开#include#define N 100#define PI 3.14main(){ ...}#undef N//这个语句就是终止宏定义N的使用,后面的子函数再出现N,就不用100替换了//而PI仍然可以正常使用,因为没有对它进行#undef终止语句void fun(){ ...}
#define PI 3.14#define s PI*r*r//再次宏定义时,里面使用前面定义好的PI
这就是宏嵌套定义
#define NULL 0
再如:EOF,代表的值是-1,文件尾 #define EOF -1
#define SINGLE float
程序中就可以这样来定义单精度浮点型变量:SINGLE x,y;
这里的x和y是float型的变量例如:#define SUM(a,b) a+b
注意SUM和后面的括号之间不能有空格,否则编译时会报错,a和b是要传进来的参数,后面的a+b是要执行的语句
#include <stdio.h>
#define F(x,y) 2*x+y
main()
{
int a=3,b=2;
printf("%d",F(a,b)*F(b,a));
}
它输出的是2*a+b*2*b+a=2*3+2*2*2+3=17
(2*a+b)*(2*b+a)
的值,那么程序得改为: #include <stdio.h>
#define F(x,y) (2*x+y)
main()
{
int a=3,b=2;
printf("%d",F(a,b)*F(b,a));
}
这样经过原模原样的替换后,括号也会替换下来 #define MAX(a,b) (a>b?a:b)
#define MIN(a,b) (a>b?b:a)
等等等很多应用,比如判断大小写字母啊,判断闰年啊什么的,可以用有参宏的定义来实现一个特定的功能,这样后面的程序中可以反复用,比函数要简单多了
比如:#include <stdio.h>
就是文件包含,stdio.h
头文件,.h
是英文单词head(头)的缩写,头文件中一般情况下是一些函数的声明,不同的编译器头文件中的内容不同,有的编译器头文件中直接是函数的函数体,把头文件包含进来直接就可以调用里面的函数;也有的编译器头文件中只是函数声明,而它们的函数体放在了库文件中。我们知道当我们想要使用printf()函数和scanf()等函数的时候需要把stdio.h
头文件包含进来,因为这些函数都是开发人员写好的函数,我们直接拿过来用就行了,这些函数的函数体一般情况下在库文件中,我们编写源代码的时候只需要把它们的声明引进来,就可以调用库文件中的函数了,头文件中也可以直接写入函数的函数体,然后用文件包含直接引用就可以了。我们也可以自己把需要的函数写入头文件,按照我们自己的开发需求,写一些需要的函数,然后用文件包含的形式在源文件中引进来,并调用就可以了。
#include <stdio.h>
或者 #include "stdio.h"
二者的区别:1.使用双引号:系统首先到当前目录下查找被包含的文件,如果没有找到,再到系统指定的“包含文件目录”(由用户在配置环境时设置)去查找。2.使用尖括号:直接到系统指定的“文件包含目录”去查找。一般来说,使用双引号比较保险,而使用尖括号可以节省查找时间 3.如果被包含文件不在当前目录中,在双引号中需要给出文件的具体路径,如:“C:\LIANXI\file2.c” 文件包含本质上也是一种原模原样的替换,即将被包含文件里面的内容原模原样复制过来,并覆盖#include语句,这样头文件里面的内容就全部被引进我们编写的源代码中了 比如:如下图,我在桌面创建了一个文本文档,里面写入了一个求阶乘的子函数 .txt
改为.h
(不改后缀也可以的) ctype.h 字符处理
math.h 与数学处理函数有关的说明与定义 stdio.h 输入输出函数中使用的有关说明和定义 string.h 字符串函数的有关说明和定义 stddef.h 定义某些常用内容 stdlib.h 杂项说明 time.h 支持系统时间函数一般格式为:
#if 表达式//该表达式的值为真(1)时执行程序段1,为假(0)时,执行程序段2 程序段1;#else 程序段2;#endif
实现条件编译:
#include#define FLAG 0void main(){ char s[80]; int i; gets(s);#if FLAG//FLAG的值为0,所以执行语句段2,如果FLAG的值为1,则执行语句段1 for(i=0;s[i]!=0;i++) if(s[i]>='a'&&s[i]<='z') s[i]-=32;#else for(i=0;s[i]!=0;i++) if(s[i]>='A'&&s[i]<='Z') s[i]+=32;#endifputs(s);}
一般格式为:
#ifdef 标识符 程序段1;#else 程序段2;#endif
可以没有#else后面的语句
#ifdef 标识符 程序段1;#endif
如果#ifdef后面的标识符已经用#define定义过了,则编译程序段1,否则编译程序段2
用条件编译实现三个数的排序:#include#define FLAG 0void main(){ int a,b,c; scanf("%d%d%d",&a,&b,&c);#ifdef FLAG if(a>b) { int t=a;a=b;b=t;} if(a>c) { int t=a;a=c;c=t;} if(b>c) { int t=b;b=c;c=t;}#else if(a
一般格式和#ifdef一样,不做多说了
作用:与#ifdef是相反的,如果#ifndef后面的标识符没有被#define定义过,则执行程序段1,否则执行程序段2 由于和前面类似,我不多解释了好了,编译预处理就这么一点内容
转载地址:http://xpnk.baihongyu.com/