014-预处理指令-C语言笔记

学习目标

1.【掌握】枚举

2.【掌握】typedef关键字

3.【理解】预处理指令

4.【掌握】#define宏定义

5.【掌握】条件编译

6.【掌握】static与extern关键字

一、枚举

当我们要描述方向、四季、性别、学历、婚配情况等等事物的时候,我们知道这些事物的取值范围是非常有限的。比如,性别取值就男、女,四季取值就春、 夏、秋、冬。类似这样的需求,C语言提供了一种构造类型枚举专门针对此类需求,由程序员自己声明一种新的数据类型,并给这个新的数据类型声明几个固定枚举 值。同时,声明这个新的数据类型的变量时,给变量赋值的取值范围就只能赋值我们类型里声明的某个固定枚举值。

枚举类型的声明

语法:enum 枚举名 {枚举值1,枚举值2,...};

enum Gender {Genderwomen, Genderman};//声明一个枚举类型,他的取值是women和man

1

enumGender{Genderwomen,Genderman};//声明一个枚举类型,他的取值是women和man

枚举变量的声明

语法:enum 枚举名 变量名;

enum Gender {Genderwomen, Genderman};//声明一个枚举类型,他的取值是women和man
enum Gender gender;//声明一个enum Gender类型的变量gender

1

2

enumGender{Genderwomen,Genderman};//声明一个枚举类型,他的取值是women和man

enumGendergender;//声明一个enum Gender类型的变量gender

变量的初始化

语法:enum 枚举名 变量名 = 枚举值;

enum Gender {Genderwomen, Genderman};//声明一个枚举类型,他的取值是women和man
enum Gender gender = Genderwomen;//声明一个enum Gender类型的变量gender并初始化为women

1

2

enumGender{Genderwomen,Genderman};//声明一个枚举类型,他的取值是women和man

enumGendergender=Genderwomen;//声明一个enum Gender类型的变量gender并初始化为women

枚举值对应的整型数值

enum Gender {Genderwomen, Genderman};//声明一个枚举类型,他的取值是women和man
enum Gender gender = Genderwomen;//声明一个enum Gender类型的变量gender并初始化为women
printf("gender = %d\n",gender);//打印出gender = 0
gender = Genderman;//重新把枚举变量赋值man
printf("gender = %d\n",gender);//打印出gender = 1
gender = 0;//这样赋值也是可以的,相当于赋值为women,但是不直观不好看.不推荐这种赋值

1

2

3

4

5

6

enumGender{Genderwomen,Genderman};//声明一个枚举类型,他的取值是women和man

enumGendergender=Genderwomen;//声明一个enum Gender类型的变量gender并初始化为women

printf("gender = %d\n",gender);//打印出gender = 0

gender=Genderman;//重新把枚举变量赋值man

printf("gender = %d\n",gender);//打印出gender = 1

gender=0;//这样赋值也是可以的,相当于赋值为women,但是不直观不好看.不推荐这种赋值

注意:

1.枚举也是一种数据类型,类型名是(enum 枚举名),必须要加上enum关键字啊。

2.给枚举变量初始化或者赋值的时候,取值只能取枚举类型的枚举值中的某个值,不能随意赋值。

3.每一个枚举值对应都有一个整型数值的,从第一个枚举值开始从0依次递增。

4.声明一个枚举变量的时候,这个变量里面存的实际上是这个枚举值对应的整型,而不是枚举值本身。

5.枚举值命名最好能加上区分这个枚举值属于哪个枚举类型的标示,比如在枚举值前面加上枚举类型名。

实际应用:

#include <stdio.h>

//性别枚举类型
enum Gender {Genderwomen,Genderman};

struct Person {
char *name;//姓名
int age;//年龄
enum Gender gender;//性别
};
int main(int argc, const char * argv[]) {

struct Person laoWang = {"老王",18,Genderman};
printf("name = %s\nage = %d\ngender = %s\n",laoWang.name,laoWang.age,laoWang.gender == 0 ? "男" : "女");
/*打印出
name = 老王
age = 18
gender = 女
*/
return 0;
}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

#include <stdio.h>

//性别枚举类型

enumGender{Genderwomen,Genderman};

structPerson{

char*name;//姓名

intage;//年龄

enumGendergender;//性别

};

intmain(intargc,constchar*argv[]){

structPersonlaoWang={"老王",18,Genderman};

printf("name = %s\nage = %d\ngender = %s\n",laoWang.name,laoWang.age,laoWang.gender==0?"男":"女");

/*打印出

name = 老王

age = 18

gender = 女

*/

return0;

}

二、typedef关键字

如果你感觉有些数据类型太长,难以记忆难以书写,我们可以使用typedef关键字为各种数据类型定义一个新名字(别名)。

语法:typedef 数据类型 别名;

typedef与普通数据类型

typedef int Integer;
Integer num = 10;//等同于int num = 10;

1

2

typedefintInteger;

Integernum=10;//等同于int num = 10;

typedef与指针

typedef char * String;
String str = "字符串";//等同于char *str = "字符串";
printf("str = %s\n", str);//打印 str = 字符串

1

2

3

typedefchar*String;

Stringstr="字符串";//等同于char *str = "字符串";

printf("str = %s\n",str);//打印 str = 字符串

typedef与结构体

//1.先声明结构体,再给结构体定义一个别名
struct Person {
char *name;
int age;
};
typedef struct Person Person;//给struct Person定义一个别名
Person person = {"老王",18};//等同于 struct Person person = {"老王",18};
printf("姓名:%s\t年龄:%d\n",person.name,person.age);

//2.声明的结构体的同时给结构体定义一个别名
typedef struct Person {
char *name;
int age;
}Person;
Person person = {"老王",18};//等同于 struct Person person = {"老王",18};
printf("姓名:%s\t年龄:%d\n",person.name,person.age);

//3.声明的结构体的同时给结构体定义一个别名,可以省略结构体名
typedef struct {
char *name;
int age;
}Person;
Person person = {"老王",18};//等同于 struct Person person = {"老王",18};
printf("姓名:%s\t年龄:%d\n",person.name,person.age);

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

//1.先声明结构体,再给结构体定义一个别名

structPerson{

char*name;

intage;

};

typedefstructPersonPerson;//给struct Person定义一个别名

Personperson={"老王",18};//等同于 struct Person person = {"老王",18};

printf("姓名:%s\t年龄:%d\n",person.name,person.age);

//2.声明的结构体的同时给结构体定义一个别名

typedefstructPerson{

char*name;

intage;

}Person;

Personperson={"老王",18};//等同于 struct Person person = {"老王",18};

printf("姓名:%s\t年龄:%d\n",person.name,person.age);

//3.声明的结构体的同时给结构体定义一个别名,可以省略结构体名

typedefstruct{

char*name;

intage;

}Person;

Personperson={"老王",18};//等同于 struct Person person = {"老王",18};

printf("姓名:%s\t年龄:%d\n",person.name,person.age);

typedef与指向结构体的指针

//声明一个结构体并定义别名
typedef struct {
char *name;
int age;
}Person;

typedef Person * PP;//给指向结构体的指针取别名
Person laoWang = {"老王", 18};//声明结构体变量
PP p = &laoWang;// 声明指针变量指向结构体变量

//利用指针变量访问结构体成员
printf("name = %s age = %d\n", p->name, p->age);

1

2

3

4

5

6

7

8

9

10

11

12

//声明一个结构体并定义别名

typedefstruct{

char*name;

intage;

}Person;

typedefPerson*PP;//给指向结构体的指针取别名

PersonlaoWang={"老王",18};//声明结构体变量

PPp=&laoWang;// 声明指针变量指向结构体变量

//利用指针变量访问结构体成员

printf("name = %s  age = %d\n",p->name,p->age);

typedef与枚举

//1.先声明枚举类型,再给枚举类型定义别名
enum Gender {Genderman,Genderwomen};
typedef enum Gender Gender;//给枚举类型起别名
Gender gender = Genderman;//声明枚举变量

//2.声明枚举类型的同时定义别名
typedef enum Gender {Genderman,Genderwomen}Gender;
Gender gender = Genderman;//使用别名声明枚举变量

//3.声明枚举类型的同时定义别名,枚举名也是可以省略的
typedef enum {Genderman,Genderwomen}Gender;
Gender gender = Genderman;//使用别名声明枚举变量

1

2

3

4

5

6

7

8

9

10

11

12

//1.先声明枚举类型,再给枚举类型定义别名

enumGender{Genderman,Genderwomen};

typedefenumGenderGender;//给枚举类型起别名

Gendergender=Genderman;//声明枚举变量

//2.声明枚举类型的同时定义别名

typedefenumGender{Genderman,Genderwomen}Gender;

Gendergender=Genderman;//使用别名声明枚举变量

//3.声明枚举类型的同时定义别名,枚举名也是可以省略的

typedefenum{Genderman,Genderwomen}Gender;

Gendergender=Genderman;//使用别名声明枚举变量

typedef与指向函数的指针

// 定义一个sum函数,计算a跟b的和
int sum(int a, int b) {
int c = a + b;
return c;
}
typedef int (*MySum)(int, int);//这里别名是MySum

int main(int argc, const char * argv[]) {

MySum p = sum;//声明一个指向sum函数的指针变量p
int result = p(4,5);// 利用指针变量p调用sum函数

printf("result = %d\n",result);//打印 result = 9
return 0;
}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

// 定义一个sum函数,计算a跟b的和

intsum(inta,intb){

intc=a+b;

returnc;

}

typedefint(*MySum)(int,int);//这里别名是MySum

intmain(intargc,constchar*argv[]){

MySump=sum;//声明一个指向sum函数的指针变量p

intresult=p(4,5);// 利用指针变量p调用sum函数

printf("result = %d\n",result);//打印 result = 9

return0;

}

三、预处理指令

让我们来回顾一下C程序从编写源代码到执行需要的步骤。先编写符合C语言语法规范的源代码文件,然后编译成二进制代码的目标文件,再然后会进行链 接,最终生成可执行文件。其实在编译之前,还有一个很重要的步骤,系统会自动执行,那就是执行预处理指令。预处理指令是在编译之前执行的,我们已经学 过#include文件包含指令,今天我们再来整几发指令。

四、#define宏定义

在程序编译之前,会把使用宏名的地方替换成宏值的内容。注意这里的替换是纯洁的替换,无论宏值是表达式还是数值,甚至是错误代码,都会原模原样的替换。

语法:#define 宏名 宏值

无参数的宏:使用无参数宏的时候,只是纯粹的文本替换

#include <stdio.h>
#define LOG printf("这里是LOG\n")
#define SUM a+b
#define AREA PI*r*r //宏值可以使用宏名,在使用地方的后面也可以
#define PI 3.14

int main(int argc, const char * argv[]) {

double num = PI * 3 * 3;//等同于double num = 3.14 * 3 * 3;
printf("num = %.2lf\n",num);

LOG;//等同于printf("这里是LOG\n");

int a= 1,b = 1;//如果宏值中有变量,必须先声明再使用
int result = SUM * 2;//等同于int result = a + b * 2; 注意替换后的运算符优先级
printf("result = %d\n",result);

int r = 2;//半径为2
float area = AREA;
printf("area = %.2f\n",area);

#undef PI //取消宏 PI ,在之后就不能替换宏值了

return 0;
}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

#include <stdio.h>

#define LOG printf("这里是LOG\n")

#define SUM a+b

#define AREA PI*r*r  //宏值可以使用宏名,在使用地方的后面也可以

#define PI 3.14

intmain(intargc,constchar*argv[]){

doublenum=PI*3*3;//等同于double num = 3.14 * 3 * 3;

printf("num = %.2lf\n",num);

LOG;//等同于printf("这里是LOG\n");

inta=1,b=1;//如果宏值中有变量,必须先声明再使用

intresult=SUM*2;//等同于int result = a + b * 2;  注意替换后的运算符优先级

printf("result = %d\n",result);

intr=2;//半径为2

floatarea=AREA;

printf("area = %.2f\n",area);

#undef PI //取消宏 PI ,在之后就不能替换宏值了

return0;

}

有参数的宏:使用有参数宏的时候,需要调用宏的人传入一个值作为宏值的一部分

#include <stdio.h>
#define Log(str) printf(str)
#define SUM(a,b) a+b //这里的参数就是宏名和宏值里相同的部分

int main(int argc, const char * argv[]) {

Log("有参数宏\n");//等同于printf("有参数宏");

int num1 = 10,num2 = 20;

//这里传入的参数是num1和num2,并不是10和20。代码执行的时候才会为num1,num2赋值10,20
int sum = SUM(num1, num2);//等同于int sum = a + b;
printf("sum = %d\n",sum);

return 0;
}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

#include <stdio.h>

#define Log(str) printf(str)

#define SUM(a,b) a+b //这里的参数就是宏名和宏值里相同的部分

intmain(intargc,constchar*argv[]){

Log("有参数宏\n");//等同于printf("有参数宏");

intnum1=10,num2=20;

//这里传入的参数是num1和num2,并不是10和20。代码执行的时候才会为num1,num2赋值10,20

intsum=SUM(num1,num2);//等同于int sum = a + b;

printf("sum = %d\n",sum);

return0;

}

注意:

1.当宏值是一个表达式,宏值的语法错误不会报错,因为检查语法是在编译的时候干的。

2.当宏值是一个表达式,替换宏名也是替换源代码中使用宏名的地方,所以特别注意替换后的运算符优先级问题。

3.宏值当中如果有变量,使用宏值之前必须要先声明这个变量。

4.如果双引号中出现了宏名,其实这个不是宏名,只是和宏名很像的字符串。

5.宏可以定义在任何地方,能被使用的作用域是从定义开始到文件结束。

五、条件编译

在很多情况下,我们希望程序的其中一部分代码只有在满足一定条件时才进行编译,否则不参与编译,这就是条件编译。

语法:

#if 条件1
代码1
#elif 条件2
代码2
#else
代码3
#endif

1

2

3

4

5

6

7

#if 条件1

代码1

#elif 条件2

代码2

#else

代码3

#endif

执行顺序:如果条件1满足,则代码1参与编译。如果条件1不满足,条件2满足,则代码2参与编译。如果条件1和条件2都不满足,则执行代码3。

第一种情况,判断宏值是否满足条件

#include <stdio.h>
#define Flag 1

//这里Score只能使用宏,不能使用变量
#if Flag == 1
#define SUM(a,b) a+b
#else
#define SUM(a,b) a-b
#endif

int main(){

int result = SUM(20, 10);//如果Flag为1则相加,否则相减
printf("result = %d\n",result);

return 0;
}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

#include <stdio.h>

#define Flag 1

//这里Score只能使用宏,不能使用变量

#if Flag == 1

#define SUM(a,b) a+b

#else

#define SUM(a,b) a-b

#endif

intmain(){

intresult=SUM(20,10);//如果Flag为1则相加,否则相减

printf("result = %d\n",result);

return0;

}

第二种情况,判断一个宏有被定义

#include <stdio.h>
#define Score 5

int main(int argc, const char * argv[]) {
#ifdef Score //等同于 #if defined(Score)
printf("已经定义了\n");
#else
printf("没有定义\n");
#endif
return 0;
}

1

2

3

4

5

6

7

8

9

10

11

#include <stdio.h>

#define Score 5

intmain(intargc,constchar*argv[]){

#ifdef Score   //等同于 #if defined(Score)

printf("已经定义了\n");

#else

printf("没有定义\n");

#endif

return0;

}

第三种情况,判断一个宏没有被定义

#ifndef ___AAAA____ //等同于 #if !defined(Score)
#define ___AAAA____
//#include <stdio.h>
//#include "xxxxx.h"
//#include "aaaaa.h"
//#include "zzzzz.h"
//#include "vvvvv.h"
//这里是一百多个头文件。。
/*
这里表示如果没有定义宏名为___AAAA____的宏,就定义一个,然后包含进来若干头文件。
然并卵?

当其他文件包含本文件多次的时候,每次都会判断是否定义了___AAAA____。如果没有定义才包含,定义过了就算了
*/
#endif

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

#ifndef ___AAAA____     //等同于 #if !defined(Score)

#define ___AAAA____

//#include <stdio.h>

//#include "xxxxx.h"

//#include "aaaaa.h"

//#include "zzzzz.h"

//#include "vvvvv.h"

//这里是一百多个头文件。。

/*

这里表示如果没有定义宏名为___AAAA____的宏,就定义一个,然后包含进来若干头文件。

然并卵?

当其他文件包含本文件多次的时候,每次都会判断是否定义了___AAAA____。如果没有定义才包含,定义过了就算了

*/

#endif

注意:

1.条件编译一定要使用宏进行条件判断,不能使用变量,因为变量的值是在程序执行的时候才赋值的。

2.#endif表示这个条件编译结束,一定不能少,不然会发生一些不可预料的事情。

3.条件编译只会编译符合条件的那一个分支编译成二进制代码。

六、static与extern关键字

static与函数

如果一个函数被static关键字修饰,只能在当前模块中使用,就相当于内部函数咯。

extern与函数

如果一个函数被extern关键字修饰,可以在当前模块中使用,也能被其他模块共享,不过默认函数就是被extern修饰的,可以省略不写。

static与变量

被static修饰的局部变量会声明在常量区中,函数执行完毕后不会被释放,只有程序执行结束才会释放。

#include <stdio.h>

void test(){
static int num = 10;
num++;
printf("num = %d\n",num);
}
int main(){

for (int i = 0; i < 5; i++) {
test();//执行5次test函数
}
/*打印出
num = 11
num = 12
num = 13
num = 14
num = 15
*/
return 0;
}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

#include <stdio.h>

voidtest(){

staticintnum=10;

num++;

printf("num = %d\n",num);

}

intmain(){

for(inti=0;i<5;i++){

test();//执行5次test函数

}

/*打印出

num = 11

num = 12

num = 13

num = 14

num = 15

*/

return0;

}

被static关键字修饰的全局变量只能在当前模块中使用,不能被其他模块共享,相当于私有全局变量。

main.c文件

#include <stdio.h>
#include "test.h"
void test(){
num++;
printf("num = %d\n",num);
}
int main(){
for (int i = 0; i < 5; i++) {
test();
}
return 0;
}

1

2

3

4

5

6

7

8

9

10

11

12

#include <stdio.h>

#include "test.h"

voidtest(){

num++;

printf("num = %d\n",num);

}

intmain(){

for(inti=0;i<5;i++){

test();

}

return0;

}

test.h文件

static int num;

1

staticintnum;

test.c文件

#include "test.h"
static int num = 100;

1

2

#include "test.h"

staticintnum=100;

extern与变量

extern不能修饰局部变量,被extern修饰的全局变量可以在当前模块中使用,也能被其他模块共享。不过默认全局变量就是extern修饰 的,所以我们可以省略(Xcode6.3前是默认加extern的,Xcode6.3后必须自己在声明里加上extern,但定义的地方可以不写)。

main.c文件

#include <stdio.h>
#include "test.h"
void test(){
num++;
printf("num = %d\n",num);
}
int main(){
for (int i = 0; i < 5; i++) {
test();
}
return 0;
}

1

2

3

4

5

6

7

8

9

10

11

12

#include <stdio.h>

#include "test.h"

voidtest(){

num++;

printf("num = %d\n",num);

}

intmain(){

for(inti=0;i<5;i++){

test();

}

return0;

}

test.h文件

extern int num;

1

externintnum;

test.c文件

#include "test.h"
extern int num = 100;

1

2

#include "test.h"

externintnum=100;

时间: 2024-08-04 07:38:59

014-预处理指令-C语言笔记的相关文章

17-C语言预处理指令3-文件包含

说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语言.iOS开发不感兴趣,请忽略 这讲介绍最后一个预处理指令---文件包含 一.基本概念 其实我们早就有接触文件包含这个指令了, 就是#include,它可以将一个文件的全部内容拷贝另一个文件中. 二.一般形式 1.第1种形式#include <文件名> 直接到C语言库函数头文件所在的目录中寻找文件 2.第2种形式 #include "文件名&quo

15-C语言预处理指令1-宏定义

预处理指令简介 1.C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释(比如之前使用的#include文件包含指令),产生一个新的源程序(这个过程称为编译预处理),之后再进行通常的编译 2.为了区分预处理指令和一般的C语句,所有预处理指令都以符号"#"开头,并且结尾不用分号 3.预处理指令可以出现在程序的任何位置,它的作用范围是从它出现的位置到文件尾.习惯上我们尽可能将预处理指令写在源程序开头,这种情况下,它的作用范围就是整个源程序文件 4.C语言提供的预处理指令主要有:宏

从头开始-06.C语言中预处理指令

预处理指令 不带参数的宏定义: 格式: #define 宏名 值 作用:提高代码的可读性 在程序编译前把所有出现宏名标示的位置都替换为定义宏的时候,宏名后面的值 带参数的宏定义 格式 #define 宏名(参数列表) 参数表达式 作用:在编译之前,把所有出现宏名(x)地方,都替换成把 参数代入参数表达 我写带参数的宏定义的时候,需要把每一个参数和结果都使用()扩起来 条件编译: 格式: #if #elif #else #endif 作用:当条件满足的时候就编译它后的语句 注意点:条件编译必须以#

笔记2:预处理器-(1)预处理指令

通常来说预处理器是由预处理指令(由#字符开头的一些命令)控制的,而大多数指令都属于以下三种类型之一: 1.宏定义:#define指令定义一个宏,#undef指令删除一个宏定义 2.文件包括:#include指令导致一个指定文件的内容被包含到程序之中 3.条件编译:#if.#ifdef.#ifndef.#elif.#else和#endif指令可以根据预处理器可以测试的条件来确定是将一段文本块包含到程序中还是讲其排除在程序之外 (*.除此之外还有#error.#line.#pragma等指令,相对来

C语言中的预处理指令和递归

C语言中的预处理指令和递归 上个月就完成了黑马程序员的IOS基础视频教程,还记得刚开始学的时候,什么都不懂,现在学完基础感觉真的很不错! 每天都在期待着去黑马,憧憬着以后的生活.去黑马的路越来越接近了,我真的好兴奋!这些天一直在复习,感觉C语言中的预处理指令和递归都忘得差不多了. 预处理指令:是在编译器把代码编译成0跟1之前就会执行的一些指令.所有的预处理指令都是以#开头的. 预处理指令分为三种: 1.宏定义 用法--如:#define MYINT  int   表示把右边的int 在本代码以下

黑 马 程 序 员_视频学习总结&lt;C语言&gt;----04 预处理指令

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 一.预处理指令简介 1.C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释(比如之前使用的#include文件包含指令),产生一个新的源程序(这个过程称为编译预处理),之后再进行通常的编译 2.为了区分预处理指令和一般的C语句,所有预处理指令都以符号"#"开头,并且结尾不用分号 3.预处理指令可以出现在程序的任何位置,它的

黑马程序员-C学习笔记之预处理指令

---------------------- IOS开发.Android培训.期待与您交流! ---------------------- 一.什么是预处理指令 预处理指令是告诉编译器在编译之前预先处理的一些指令,有宏定义,文件包含,条件编译. 预处理指令一般以 # 号开头,可以出现在文件的任何地方,作用于整个文件. 二.宏定义 宏定义分不带参数的和带参数的宏定义.     1?不带参数的宏定义 #import <stdio.h> #define AGE 10 // 宏名用大写 int ma

C语言三)预处理指令

一.预处理指令 1.定义 C语言在对源程序进行编译之前,会先对一些特殊的预处理指令做解释,如:#include,产生一个新的源程序,这个过程称为"编译预处理",之后再进行通常的编译工作. 2.作用范围 预处理指令可以出现在程序的任意位置,它的作用范围是从它出现的位置到文件末尾.习惯上,我们把预处理指令写在源程序开头. 3.类型 C语言提供了预处理指令主要有:宏定义.文件包含和条件编译. 二.不带参数的宏定义 1.一般形式 #define 宏名 字符串 如:#define A 10; /

黑马程序员--C语言--预处理指令、枚举、Typedef、递归函数、变量作用域

一.预处理指令 1>所有的预处理指令都是以#号开头; 2>预处理指令是在代码翻译成0,1之前执行: 3>预处理指令最后没有分号: 4>预处理指令的位置可以随便写: 5>预处理指令有作用域,从编写指令的那一行开始,一直到文件结尾,可以用#undef取消宏定义的作用: 预处理指令分3种 1> 宏定义 2> 条件编译 3> 文件包含 二.宏定义 1. 宏定义命名规则: 1>大写字母 1 #define COUNT 2>k开头首字母大写 #define