//a.c
#include <stdio.h>
#include "b.c"
void main()
{
int var;
var = increment();
var = increment();
var = increment();
count = count + 3;
var = count;
printf("%d", var);
}
//b.c
static int count;
int increment()
{
++count;
return count;
}
现在和b.c文件一样,我有一个名为count的变量,它是静态的。现在,这个变量不应该在a.c中直接访问,但在我的情况下,我可以访问和操作它。所以我错过了什么吗?
OUTPUT
6
a.c
中的#include "b.c"
使b.c
成为a.c
编译的一部分;它们被编译为一个源文件。
要使单独源文件中的标识符保持独立,可以单独编译它们,而不使用#include
将一个标识符包含在另一个文件中。单独的编译生成单独的对象文件(Unix和类Unix系统上的.o
文件(,然后使用链接命令将其链接在一起(该命令可能包含在gcc
命令中或由其执行(。
分离源文件还可以分离您希望在两个文件之间共享的标识符,即名为increment
的函数。所以a.c
不会知道increment
,编译器会抱怨。要为单个函数处理此问题,您可以简单地用extern int increment();
声明a.c
中的函数。然而,管理这种标识符共享的常用技术是:
- 创建一个名为
b.h
的文件,该文件声明要在b.c
中定义但与其他源文件共享的标识符 - 在
b.h
中,用extern int increment();
声明increment
- 在任何将使用来自
b.c
的标识符的源文件中,包括b.h
和#include "b.h"
- 在
b.c
中,还包括b.h
。这样可以检查b.h
中的声明是否与b.c
中的定义匹配,因为编译器在编译b.c
时会同时看到这两个声明,并报告不一致
您已经将b.c包含在a.c中,因此就编译器而言,它们成为一个单独的单元。因此,您可以看到静态变量。
如果删除include行,则不会看到count
或increment
,尽管后者将被隐式声明,因为它是一个函数。