1.声明外部变量
用法: 在变量定义之前如果使用该变量,则在使用之前加上extern
关键词,作用域从声明开始,到本文件结束。但有一点注意,还得定义一遍,只不过前面加上了关键词。
#include <stdio.h>
int mysum(int x, int y);
int main(int argc, char *argv[])
{
int result;
extern int x; /* 这里的类型名字可以去掉,但是会有警告产生 */
extern int y;
result = mysum(x, y);
printf("The max number is %d\n", result);
return 0;
}
int x = 10;
int y = 15;
int mysum(int x, int y)
{
return x + y;
}
2.在多个文件中声明外部变量
如果整个工程由多个文件组成,在一个文件中可以引用另外一个文件中已经定义的外部变量时,则只需使用关键字extern
加以声明即可,可见,这时的变量作用域从一个文件扩展到了多个文件。
测试的例子:
a.c:
#include <stdio.h>
extern int mysum(int x, int y);
int main(int argc, char **argv)
{
int result = mysum(1, 3);
printf("Here, our result from extern mysum is %d\n", result);
}
b.c
int mysum(int x, int y);
int x = 10;
int y = 15;
int mysum(int x, int y)
{
return x + y;
}
注意编译的命令为: gcc a.c b.c -o test
还有利用这种方法去定义接口,在上面的例子中就是a.c中,再一次定义一个变量,在b.c中,使用extern
关键字来声明变量即可,然后因为你在a.c中调用的函数,所以你就可以改变传递给函数的参数了。
那么,这种方法与通过函数形参传递变量的区别在哪里?如果仅仅是传值,估计是起不到作用的,你会想到传地址的方法,这样可以,但是在一个大型项目中,可能有很多程序同时调用函数,这里就会涉及到竞态的问题。使用extern的方式就比较安全。
3.在多个文件中声明外部结构体变量
我一开始也有误解,现在看来,结构体的有些不同。
a.c :
#include<stdio.h>
#include "b.h"
#include "c.h" /*引入 print() */
A_class local_post = {1, 2, 3};
A_class next_post = {4,5,6};
int main(int argc, char **argv)
{
A_class ret;
print("first point", local_post);
print("second point", next_post);
ret = function(local_post, next_post);
printf("The vector is (%d %d %d)\n", ret.x, ret.y, ret.z);
printf("Or print with function(print) from c.h:\n");
print("After two array", ret);
return 0;
}
b.c
#include<stdio.h>
#include "b.h"
/* 配合b.h,*/
A_class function(A_class first, A_class next)
{
A_class ret;
ret.x = next.x - first.x;
ret.y = next.y - first.y;
ret.z = next.z - first.z;
return ret;
}
b.h:
#ifndef __B_H
#define __B_H
#if 1
typedef struct {
int x;
int y;
int z;
} A_class;
#endif
extern A_class local_post; /* 外部结构体声明*/
extern A_class function(A_class x, A_class y); /* 接口函数声明*/
#endif
c.c
#include<stdio.h>
#include "b.h"
int print(char *str, A_class post)
{
printf("%s: (%d, %d, %d)\n", str, post.x, post.y, post.z);
return 0;
}
c.h
#ifndef __C_H
#define __C_H
extern int print(char *, A_class post);
#endif
之所以还贴这么多代码,主要是觉得这个例子在内核中大量存在。除了extern关键字外,还有预定义符号,多复习。
#4 用extern声明函数 记住两点:
-
定义函数时,需要声明函数值返回值为extern,表示这个函数是外部函数,可以供外部文件使用。
-
调用函数事,也要使用
extern
关键字。
代码就先不贴了。