C语⾔对源程序处理的四个步骤:预处理、编译、汇编、链接——预处理篇
预处理
1)预处理的基本概念
C语⾔对源程序处理的四个步骤:预处理、编译、汇编、链接。
预处理是在程序源代码被编译之前,由预处理器(Preprocessor)对程序源代码进⾏的处理。这个过程并不对程序的源代码语法进⾏解析,但它会把源代码分割或处理成为特定的符号为下⼀步的编译做准备⼯作。
2)预编译命令
C编译器提供的预处理功能主要有以下四种:
1)⽂件包含 #include
2)宏定义 #define
3)条件编译 #if #endif ..
4)⼀些特殊作⽤的预定义宏
a、⽂件包含处理
1)⽂件包含处理
⽂件包含处理”是指⼀个源⽂件可以将另外⼀个⽂件的全部内容包含进来。C语⾔提供了#include命令⽤来实现“⽂件包含”的操作。
2)#include< > 与 #include ""的区别
" "表⽰系统先在file1.c所在的当前⽬录file1.h,如果不到,再按系统指定的⽬录检索。
< >表⽰系统直接按系统指定的⽬录检索。
注意:
1. #include <>常⽤于包含库函数的头⽂件
2. #include " "常⽤于包含⾃定义的头⽂件 (⾃定义的头⽂件常⽤“ ”,因为使⽤< >时需要在系统⽬录检索中加⼊⾃定义头⽂件的绝对地址/相对地址否则⽆法检索到该⾃定义的头⽂件,编译时会报错)
3. 理论上#include可以包含任意格式的⽂件(.c .h等) ,但我们⼀般⽤于头⽂件的包含。
b、宏定义
1)基本概念
在源程序中,允许⼀个标识符(宏名)来表⽰⼀个语⾔符号字符串⽤指定的符号代替指定的信息。
在C语⾔中,“宏”分为:⽆参数的宏和有参数的宏。
2)⽆参数的宏定义
#define 宏名 字符串
例: #define PI 3.141926源程序是指什么程序
在编译预处理时,将程序中在该语句以后出现的所有的PI都⽤3.1415926代替。
这种⽅法使⽤户能以⼀个简单的名字代替⼀个长的字符串,在预编译时将宏名替换成字符串的过程称为“宏展开”。宏定义,只在宏定义的⽂件中起作⽤。
1 #include <stdio.h>
2
3#define PI 3.1415f
4
5int main(void)
6{
7float L,S,R,V;
8 printf("Input Radius:");
9 scanf("%f",&R);
10
11 L=2.0f*PI*R;
12 S=PI*R*R;
13 V=4.0f/3*PI*R*R*R;
14
15 printf("L=%.4f,S=%.4f,V=%.4f\n",L,S,V);
16
17return0;
18 }
说明:
1) 宏名⼀般⽤⼤写,以便于与变量区别
2) 字符串可以是常数、表达式等
3) 宏定义不作语法检查,只有在编译被宏展开后的源程序才会报错
4) 宏定义不是C语⾔,不在⾏末加分号
5) 宏名有效范围为从定义到本源⽂件结束
6) 可以⽤#undef命令终⽌宏定义的作⽤域
7) 在宏定义中,可以引⽤已定义的宏名
3)带参数的宏定义
1) 格式:#define 宏名(形参表) 字符串
2) 调⽤:宏名(形参表)
3) 宏展开:进⾏宏替换
#define S(a,b) a*b
……
Area = S(3,2);
1 #include <stdio.h>
2
3#define SQ_1(y) (y)*(y)
4#define SQ_2(y) y*y
5
6int main(void)
7{
8int a = 0,num_1 = 0,num_2 = 0;
9 scanf("%d",&a);
10 num_1 = SQ_1(a+1); //num_1 = (a+1)*(a+1);
11 num_2 = SQ_2(a+1); //num_2 = a+1*a+1;
12
13 printf("num_1 = %d\n",num_1);
14 printf("num_2 = %d\n",num_2);
15
16return0;
17 }
c、条件编译
1)基本概念
⼀般情况下,源程序中所有的⾏都参加编译。但有时希望对部分源程序⾏只在满⾜⼀定条件时才编译,即对这部分源程序⾏指定编译条件。
2)条件编译的作⽤
1)防⽌头⽂件被重复包含引⽤
1#ifndef _SOMEFILE_H
2#define _SOMEFILE_H
3
4//需要声明的变量、函数
5//宏定义
6//结构体
7
8#endif
2) 软件裁剪
同样的C源代码,条件选项不同可以编译出不同的可执⾏程序。
1 #include <stdio.h>
2 #include <stdlib.h>
3
4#define BIG 1
5int main(void)
6{
7char str[20] = "C Language";
8char C;
9int i = 0;
10while ((C = str[i++]) != '\0')
11 {
12#if BIG
13if (C >= 'a' && C <= 'z')
14 C = C - 32;
15#else
16if (C >= 'A'&& C <= 'Z')
17 C = C + 32;
18#endif
19 printf("%c", C);
20 }
21
22 system("pause");
23
24return0;
25 }
d、⼀些特殊的预定宏
C编译器,提供了⼏个特殊形式的预定义宏,在实际编程中可以直接使⽤,很⽅便。 1// __FILE__ 宏所在⽂件的源⽂件名
2// __LINE__ 宏所在⾏的⾏号
3// __DATE__ 代码编译的⽇期
4// __TIME__ 代码编译的时间
5
6 #include <stdio.h>
7 #include <stdlib.h>
8
9int main(void)
10{
11
12 printf("%s\n", __FILE__);
13 printf("%d\n", __LINE__);
14 printf("%s\n", __DATE__);
15 printf("%s\n", __TIME__); 16
17 system("pause");
18
19return0;
20 }
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论