Skip to content

Commit 7095f97

Browse files
author
yangjingjing
committed
init blog
1 parent 7698aa0 commit 7095f97

File tree

73 files changed

+31869
-2422
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

73 files changed

+31869
-2422
lines changed
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
---
2+
layout: post
3+
categories: [C]
4+
description: none
5+
keywords: C
6+
---
7+
# C语言关键字extern
8+
9+
10+
## 概述
11+
我们知道,程序的编译单位是源程序文件,一个源文件可以包含一个或若干个函数。在函数内定义的变量是局部变量,而在函数之外定义的变量则称为外部变量,外部变量也就是我们所讲的全局变量。
12+
13+
它的存储方式为静态存储,其生存周期为整个程序的生存周期。全局变量可以为本文件中的其他函数所共用,它的有效范围为从定义变量的位置开始到本源文件结束。
14+
15+
然而,如果全局变量不在文件的开头定义,有效的作用范围将只限于其定义处到文件结束。如果在定义点之前的函数想引用该全局变量,则应该在引用之前用关键字 extern 对该变量作“外部变量声明”,表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。
16+
17+
来看一个简单的例子:
18+
```c
19+
#include <stdio.h>
20+
int max(int x,int y);
21+
int main(void)
22+
{
23+
int result;
24+
/*外部变量声明*/
25+
extern int g_X;
26+
extern int g_Y;
27+
result = max(g_X,g_Y);
28+
printf("the max value is %d\n",result);
29+
return 0;
30+
}
31+
/*定义两个全局变量*/
32+
int g_X = 10;
33+
int g_Y = 20;
34+
int max(int x, int y)
35+
{
36+
return (x>y ? x : y);
37+
}
38+
```
39+
代码中,全局变量 g_X 与 g_Y 是在 main 函数之后声明的,因此它的作用范围不在 main 函数中。如果我们需要在 main 函数中调用它们,就必须使用 extern 来对变量 g_X 与 g_Y 作“外部变量声明”,以扩展全局变量的作用域。也就是说,如果在变量定义之前要使用该变量,则应在使用之前加 extern 声明变量,使作用域扩展到从声明开始到本文件结束。
40+
41+
如果整个工程由多个源文件组成,在一个源文件中想引用另外一个源文件中已经定义的外部变量,同样只需在引用变量的文件中用 extern 关键字加以声明即可。
42+
43+
下面就来看一个多文件的示例:
44+
```
45+
/****max.c****/
46+
#include <stdio.h>
47+
/*外部变量声明*/
48+
extern int g_X ;
49+
extern int g_Y ;
50+
int max()
51+
{
52+
return (g_X > g_Y ? g_X : g_Y);
53+
}
54+
55+
/***main.c****/
56+
#include <stdio.h>
57+
/*定义两个全局变量*/
58+
int g_X=10;
59+
int g_Y=20;
60+
int max();
61+
int main(void)
62+
{
63+
int result;
64+
result = max();
65+
printf("the max value is %d\n",result);
66+
return 0;
67+
}
68+
```
69+
运行结果为:
70+
```
71+
the max value is 20
72+
```
73+
对于多个文件的工程,都可以采用上面这种方法来操作。对于模块化的程序文件,可在其文件中预先留好外部变量的接口,也就是只采用 extern 声明变量,而不定义变量,max.c 文件中的 g_X 与 g_Y 就是如此操作的。
74+
75+
通常,这些外部变量的接口都是在模块程序的头文件中声明的,当需要使用该模块时,只需要在使用时具体定义一下这些外部变量即可。main.c 里的 g_X 与 g_Y 则是相关示例。
76+
77+
不过,需要特别注意的是,由于用 extern 引用外部变量,可以在引用的模块内修改其变量的值,因此,如果有多个文件同时要对应用的变量进行操作,而且可能会修改该变量,那就会影响其他模块的使用。因此,我们要慎重使用。
78+
79+
80+
81+
82+
83+
84+
85+
86+
87+
88+
89+
90+
91+
92+
93+
94+
95+
96+
97+
98+
99+
100+
101+
102+
103+
104+
105+
106+
107+
108+
109+
110+
111+
112+

_posts/2015-09-22-C语言文件.md

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
---
2+
layout: post
3+
categories: [C]
4+
description: none
5+
keywords: C
6+
---
7+
# C语言文件
8+
我们对文件的概念已经非常熟悉了,比如常见的 Word 文档、txt 文件、源文件等。文件是数据源的一种,最主要的作用是保存数据。
9+
10+
## 概述
11+
在操作系统中,为了统一对各种硬件的操作,简化接口,不同的硬件设备也都被看成一个文件。对这些文件的操作,等同于对磁盘上普通文件的操作。
12+
13+
例如:
14+
- 通常把显示器称为标准输出文件,printf 就是向这个文件输出数据;
15+
- 通常把键盘称为标准输入文件,scanf 就是从这个文件读取数据。
16+
17+
常见硬件设备所对应的文件
18+
文件 硬件设备
19+
- stdin 标准输入文件,一般指键盘;scanf()、getchar() 等函数默认从 stdin 获取输入。
20+
- stdout 标准输出文件,一般指显示器;printf()、putchar() 等函数默认向 stdout 输出数据。
21+
- stderr 标准错误文件,一般指显示器;perror() 等函数默认向 stderr 输出数据(后续会讲到)。
22+
- stdprn 标准打印文件,一般指打印机。
23+
24+
我们不去探讨硬件设备是如何被映射成文件的,大家只需要记住,在C语言中硬件设备可以看成文件,有些输入输出函数不需要你指明到底读写哪个文件,系统已经为它们设置了默认的文件,当然你也可以更改,例如让 printf 向磁盘上的文件输出数据。
25+
26+
操作文件的正确流程为:打开文件 --> 读写文件 --> 关闭文件。文件在进行读写操作之前要先打开,使用完毕要关闭。
27+
28+
所谓打开文件,就是获取文件的有关信息,例如文件名、文件状态、当前读写位置等,这些信息会被保存到一个 FILE 类型的结构体变量中。关闭文件就是断开与文件之间的联系,释放结构体变量,同时禁止再对该文件进行操作。
29+
30+
在C语言中,文件有多种读写方式,可以一个字符一个字符地读取,也可以读取一整行,还可以读取若干个字节。文件的读写位置也非常灵活,可以从文件开头读取,也可以从中间位置读取。
31+
32+
## 文件流
33+
所有的文件(保存在磁盘)都要载入内存才能处理,所有的数据必须写入文件(磁盘)才不会丢失。数据在文件和内存之间传递的过程叫做文件流,类似水从一个地方流动到另一个地方。数据从文件复制到内存的过程叫做输入流,从内存保存到文件的过程叫做输出流。
34+
35+
文件是数据源的一种,除了文件,还有数据库、网络、键盘等;数据传递到内存也就是保存到C语言的变量(例如整数、字符串、数组、缓冲区等)。我们把数据在数据源和程序(内存)之间传递的过程叫做数据流(Data Stream)。相应的,数据从数据源到程序(内存)的过程叫做输入流(Input Stream),从程序(内存)到数据源的过程叫做输出流(Output Stream)。
36+
37+
输入输出(Input output,IO)是指程序(内存)与外部设备(键盘、显示器、磁盘、其他计算机等)进行交互的操作。几乎所有的程序都有输入与输出操作,如从键盘上读取数据,从本地或网络上的文件读取数据或写入数据等。通过输入和输出操作可以从外界接收信息,或者是把信息传递给外界。
38+
39+
我们可以说,打开文件就是打开了一个流。
40+

0 commit comments

Comments
 (0)