黑马程序员 C语言 - 09 预处理指令、typedef、extern、static
2014-08-29 19:57
555 查看
若排版有错误,请查看PDF:C语言 - 09 预处理指令、typedef、extern、static.pdf
2. 预处理指令分3种
1) 宏定义
2) 条件编译(满足条件才进行编译)
3) 文件包含
3. 预处理指令在代码翻译成0、1(编译)之前执行
4. 预处理指令的位置是随便写的
5. 预处理指令的作用域:从编写指令的那一行开始,一直到文件结尾,可以用#undef取消宏定义的作用
2. 宏名一般用大写或者以k开头,变量名一般用小写
3. 作用域:从编写指令的那一行开始,一直到文件结尾,可以用#undef取消宏定义的作用
#define kCount 6
#define sum(v1,v2) ((v1)+(v2))
// 带参数的宏定义效率比函数高,每个参数都要加()
#define pingfang(a) ((a)*(a))
int main()
{
int ages[kCount] = {1,2,
3, 4,
5, 6};// kCount替换成6
#undef kCount //从这行开始宏失效
int c = sum(2,3) * sum(6,4);
int d = pingfang(5+5)/pingfang(2);
#define A 10
int main()
{
#if (A == 10)
printf("a是10\n");//
条件满足,只编译这一句
#elif (A == 5)
printf("a是5\n");
#else
printf("a其他值\n");
#endif
#ifdef A //如果定义A宏,那么编译printf
#ifndef A //如果没有定义A宏,那么编译printf
printf();
}
2. 不允许循环包含,比如a.h包含b.h,b.h又包含a.h
3. 在Lisi.h文件开头加入:
#ifndef LISI_H
#define LISI_H
可防止重复编译
int sum(int a,int b);
#endif
给指针类型char*起一个新的类型名称String
typedef
struct
{
int age;
} MyStu;
/*
struct Student
{
int age;
};
typedef struct Student MyStu;
*/
2) 指向结构体的指针
typedef
struct Person
{
int age;
} * PersonPoint;
/*
struct Person
{
int age;
};
typedef struct Person * PersonPoint;
*/
enum {
Man,
Woman
} MySex;
/*
enum Sex {Man,Woman};
typedef enum SexMySex;
*/
int main()
{
// 定义指针
String name = "jack";
// 定义结构体变量
struct Person p = {20};
// 定义指向结构体的指针
PersonPoint p2 = &p; // struct Person *p2 =&p;
// 定义枚举变量
MySex s = Man;// enum Sex s = Man;
// 定义指向函数的指针
MyPoint p = sum;
int (*p)(int,int) = sum;
p(10,
11);
return
0;
}
2) 不允许有重名的外部函数
2) 允许有重名的内部函数
(extern可省略,默认情况下声明和定义的函数都是外部函数)
1) 完整地声明一个外部函数
extern void test();
2) 完整地定义一个外部函数
extern
void test()
{
}
1) 声明一个内部函数
static void test2();
2) 定义一个内部函数
static
void test2()
{
}
b) 默认情况下,所有的全局变量都是外部变量
c) 不同文件中的同名外部变量,都代表着同一个变量
b) 不同文件中的同名内部变量,互不影响
extern int a;
static int b;
b) 并没有改变局部变量的作用域
c) 所有的test函数都共享着一个变量b
b) 这个函数内部的某个变量值是固定不变的
void test()
{ // test函数掉用完后a的存储空间回收;b的值和存储空间保留,b的作用域不变
int a =
0;
a++;
printf("a的值是%d\n", a);//
值总为:1
static
int b = 0;
// 第二次调用时,省略static这一行
b++;
printf("b的值是%d\n", b);//
第二次调用值为:2
}
第十八章 预处理指令
1. 所有的预处理指令都是以#开头2. 预处理指令分3种
1) 宏定义
2) 条件编译(满足条件才进行编译)
3) 文件包含
3. 预处理指令在代码翻译成0、1(编译)之前执行
4. 预处理指令的位置是随便写的
5. 预处理指令的作用域:从编写指令的那一行开始,一直到文件结尾,可以用#undef取消宏定义的作用
一、 宏定义
1. 宏定义只是文本替换2. 宏名一般用大写或者以k开头,变量名一般用小写
3. 作用域:从编写指令的那一行开始,一直到文件结尾,可以用#undef取消宏定义的作用
#define kCount 6
#define sum(v1,v2) ((v1)+(v2))
// 带参数的宏定义效率比函数高,每个参数都要加()
#define pingfang(a) ((a)*(a))
int main()
{
int ages[kCount] = {1,2,
3, 4,
5, 6};// kCount替换成6
#undef kCount //从这行开始宏失效
int c = sum(2,3) * sum(6,4);
int d = pingfang(5+5)/pingfang(2);
二、 条件编译
条件编译(满足条件才编译):#if最后一定要写#endif#define A 10
int main()
{
#if (A == 10)
printf("a是10\n");//
条件满足,只编译这一句
#elif (A == 5)
printf("a是5\n");
#else
printf("a其他值\n");
#endif
#ifdef A //如果定义A宏,那么编译printf
#ifndef A //如果没有定义A宏,那么编译printf
printf();
}
三、 文件包含
1. <>表示系统自带的文件,""表示自定义的文件2. 不允许循环包含,比如a.h包含b.h,b.h又包含a.h
3. 在Lisi.h文件开头加入:
#ifndef LISI_H
#define LISI_H
可防止重复编译
int sum(int a,int b);
#endif
第十九章 typedef(类型定义)
一、 作用:给已经存在的类型起一个新的名字
二、 使用场合:
1. 基本数据类型
typedef int MyInt;2. 指针
typedef char * String;//给指针类型char*起一个新的类型名称String
3. 结构体
1) 结构体typedef
struct
{
int age;
} MyStu;
/*
struct Student
{
int age;
};
typedef struct Student MyStu;
*/
2) 指向结构体的指针
typedef
struct Person
{
int age;
} * PersonPoint;
/*
struct Person
{
int age;
};
typedef struct Person * PersonPoint;
*/
4. 枚举
typedefenum {
Man,
Woman
} MySex;
/*
enum Sex {Man,Woman};
typedef enum SexMySex;
*/
5. 指向函数的指针
typedef int (*MyPoint)(int,int);int main()
{
// 定义指针
String name = "jack";
// 定义结构体变量
struct Person p = {20};
// 定义指向结构体的指针
PersonPoint p2 = &p; // struct Person *p2 =&p;
// 定义枚举变量
MySex s = Man;// enum Sex s = Man;
// 定义指向函数的指针
MyPoint p = sum;
int (*p)(int,int) = sum;
p(10,
11);
return
0;
}
第二十章 extern、static
一、 声明、定义的区别
声明可以重复,定义不能重复二、 对函数的作用
1. 外部函数
1) 定义的函数能被本文件和其他文件访问(默认)2) 不允许有重名的外部函数
2. 内部函数
1) 定义的函数只能被本文件访问2) 允许有重名的内部函数
3. extern
声明和定义一个外部函数(extern可省略,默认情况下声明和定义的函数都是外部函数)
1) 完整地声明一个外部函数
extern void test();
2) 完整地定义一个外部函数
extern
void test()
{
}
4. static
声明和定义一个内部函数1) 声明一个内部函数
static void test2();
2) 定义一个内部函数
static
void test2()
{
}
三、 对变量的作用
1. 全局变量
默认初值是01) 外部变量
a) 定义的变量能被本文件和其他文件访问b) 默认情况下,所有的全局变量都是外部变量
c) 不同文件中的同名外部变量,都代表着同一个变量
2) 内部变量
a) 定义的变量只能被本文件访问,不能被其他文件访问b) 不同文件中的同名内部变量,互不影响
3) extern
声明一个外部变量extern int a;
4) static
定义一个内部变量static int b;
2. 局部变量
无固定的初值1) static修饰局部变量
a) 延长局部变量的生命周期:程序结束的时候,局部变量才会被销毁b) 并没有改变局部变量的作用域
c) 所有的test函数都共享着一个变量b
2) 适用场合
a) 如果某个函数的调用频率特别高b) 这个函数内部的某个变量值是固定不变的
void test()
{ // test函数掉用完后a的存储空间回收;b的值和存储空间保留,b的作用域不变
int a =
0;
a++;
printf("a的值是%d\n", a);//
值总为:1
static
int b = 0;
// 第二次调用时,省略static这一行
b++;
printf("b的值是%d\n", b);//
第二次调用值为:2
}
相关文章推荐
- 黑马程序员--c语言:结构体、枚举、预处理指令、typedef、static与extern、递归思想
- 黑马程序员————C语言(预处理指令、static与extern、typedef)
- C语言数据类型总结,预处理指令,typedef,static&extern,递归笔记
- c语言预处理指令、typedef、static和extern相关介绍
- 黑马程序员——C语言热身——预处理指令、变量类型、static和extern、结构体、枚举
- 黑马程序员———C语言———【枚举、typedef、宏、static和extern、文件操作】
- 黑马程序员--ios基础--c语言--预处理指令、typedef、static和extern、递归
- C语言热身——预处理指令、变量类型、static和extern、结构体、枚举
- 黑马程序员——C语言------typedef、static和extern
- 黑马程序员——C语言的关键字 typedef,static,extern和预处理指令
- 黑马程序员-C语言中static、extern、typedef、enum使用的注意事项
- 黑马程序员------C语言-----宏定义、typedef、static和extern、递归
- C语言-07-预处理、typedef、static和extern
- 黑马程序员——C语言知识点总结之预处理指令和typedef关键字
- 黑马程序员-IOS-C语言预处理指令及杂项小计
- C语言回顾之结构体、枚举、宏定义、typedef、extern和static的使用
- C语言易混淆关键词详解-const,static,extern,typedef,声明
- 黑马程序员__c语言预编译指令和typedef的使用
- C语言预处理及特殊函数介绍(extern/exit/atexit/volatile/static/calloc/realloc等)PART TWO
- C语言易混淆关键词详解-const, static, extern, typedef, 声明