vimer linux kernel 爱好者

c语言中关键字extern简介

2017-06-10

参考这篇

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声明函数 记住两点:

  1. 定义函数时,需要声明函数值返回值为extern,表示这个函数是外部函数,可以供外部文件使用。

  2. 调用函数事,也要使用extern关键字。

代码就先不贴了。


上一篇 nftables简介

Comments

Content