extern
在源文件A里定义的函数,在其它源文件里是看不见的(即不能访问)。为了在源文件B里能调用这个函数,应该在对应的头文件中声明定义了的函数,B只需要包含这个头文件即可:
#"head.h"
extern 函数原型;
这样,在源文件B里也可以调用那个函数了。
注意这里的用词区别:在A里是定义,在头文件里是声明。一个函数只能(也必须)在一个源文件里被定义,但是可以在其它多个源文件里被声明。定义引起存储分配,是真正产生那个实体。而声明并不引起存储分配。
1.extern用在变量声明中常常有这样一个作用,你在*.c文件中定义了一个全局的变量,这个全局的变量如果要被引用,就放在*.h中并用extern来声明。
-
// 某个头文件,比如叫 ExternTest.h 中
-
extern int iExtern; // 这样就是一个变量声明——而不是定义,因为没有分配存储空间
-
//这以后就可以引用这个变量,而这个变量的存储于下面的 int iExtern; 的那个位置分配
-
-
-
// 某个源文件,比如叫 ExternTest.c 中
-
int iExtern;
-
//不能写成 static int iExtern; 因为这样就不再是全局的变量——不具有External Linkage性质
-
//也不能写成 extern int iExtern; 因为这样就不再是一个定义,
-
-
// 另一个源文件,比如叫 main.c 中
-
#include "ExternTest.h"
-
//......其他代码
-
int iTwiceExt = iExtern * 2; // 这里就可以直接用iExtern这个变量,因为在 ExternTest.h 声明过了
-
//......其他代码
2.如果函数的声明中带有关键字extern,仅仅是暗示这个函数可能在别的源文件里定义,没有其它作用。即下述两个函数声明没有区别:
extern int f(); 和int f()
如果定义函数的c/cpp文件在对应的头文件中声明了定义的函数,那么在其他c/cpp文件中要使用这些函数,只需要包含这个头文件即可。
如果你不想包含头文件,那么在c/cpp中声明该函数。一般来说,声明定义在本文件的函数不用“extern”,声明定义在其他文件中的函数用“extern”,这样在本文件中调用别的文件定义的函数就不用包含头文件。
调用定义在其他c中的函数:
-
extern print(char *p);
-
int main(int argc, char* argv[])
-
{
-
char *p="hello world!";
-
print(p);
-
return 0;
-
}
-
print(char *s)
-
{
-
printf("The string is %s/n",s);
-
}
阅读(1062) | 评论(0) | 转发(0) |