关于头文件,全局变量,extern,static

  1. 今天在复习C的时候,看到关于#include语句的一个解释,若是B 中 #include A,就是将文件A拷贝到#include A的位置中。函数

  2. 根据这个原理,因而作了一个实验。在头文件中定义一个变量(非静态变量),同时声明一个fun函数。再写一个fun.c文件,fun.c文件中实现了fun函数,最后写一个main.c文件调用fun函数。spa

  3. 三个文件的源代码以下:code

test.h
#include <stdio.h>
#include <stdlib.h>

void fun();
int com;
fun.c
#include "test.h"

void fun(){
    com = 0;
}
main.c
#include "test.h"
int main(){
    com = 4;
    fun();
    printf("%d\n", com);
    return 0;
}

, 很明显在连接的时候必然会出现“multiple definition of `com'”。通常而言也不会在头文件中定义变量和函数。只能够声明变量,好比使用static能够在头文件中声明变量。以下所示:orm

test.h
#include <stdio.h>
#include <stdlib.h>

void fun();
static int com;

其余两个文件不作改动,编译、连接和运行都没有报错,输出结果是4. 由于静态变量存储静态存储区,可是静态变量的做用域是一个文件,fun.c, main.c都会为com定义一个本地变量,所以,fun对com的改动不会影响main中的com. 若是但愿在fun.c中的改动对main有效果,可使用extern. ip

test.h
test.h
#include <stdio.h>
#include <stdlib.h>

void fun();
extern int com;
main.c
#include "test.h"

int com;
int main(){
    com = 4;
    fun();
    printf("%d\n", com);
    return 0;
}

fun.c 无须改动,此时,程序的输出结果是0。作用域

总结如下:extern变量能够声明一个外部变量,使得编译顺利用过,可是在连接以后才获得实际的变量。每个文件中定义的静态变量都会在静态存储区中分别分配一个空间,静态全局变量的做用域是该文件。在头文件中通常不会直接定义变量和函数,仅仅做声明。it

相关文章
相关标签/搜索