extern的使用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
extern的使用
在外部函数上的使用:
在定义函数时,如果冠以关键字extern,则表示此函数是外部函数,可以被其他的文件调用,如果定义函数时省略extern,则隐含为外部函数。
所以除非定义函数时用static修饰(表示内部函数,其他文件不得调用),否则都是外部函数,别的模块(文件)都可以调用。
一般来说在使用别的文件定义的函数时,要使用extern声明,但在很多系统中不用extern声明,直接使用也没问题,但这不属于标准写法,也容易让人闹不明白。
在全局变量中的使用:
全局变量是在函数的外部定义的,编译时分配在静态储存区,全局变量可以为程序中各个函数所引用,如果在一个文件中要引用另一个文件中定义的全局变量,应该用extern作说明。
简单的说就是一个文件中定义,如果另外一个文件用extern作说明,则另外一个文件就可以使用了1.)标准的全局变量和外部函数的使用
在main.c中
#include <stdio.h>
int ienum=0;
extern int test();
void main( void )
{
printf("pre value is:%d\n",ienum);
test();
printf("later value is:%d\n",ienum);
return;
}
在test.c中
extern int ienum;
void test(void)
{
ienum ++;
}
全局变量ienum在main.c中定义,在test.c中声明并使用;
外部函数test()在test.从中定义,在main.c中声明并使用。
编译,执行如下:
$ cc test.c main.c
test.c:
main.c:
$ a.out
pre value is:0
later value is:1
2.)全局变量在定义时,不初始化,则系统默认初始化为0。
int ienum=0; ----〉int ienum;
编译执行如下:
$ cc test.c main.c
test.c:
main.c:
$ a.out
pre value is:0
later value is:1
3.)如果两边都初始化,即在extern的时候赋初值,会出现什么情况呢?
在test.c中
extern int ienum;------〉extern int ienum=8;
编译,连接如下:
$ cc test.c main.c
test.c:
main.c:
ld: 致命的: 符号`ienum' 是多次定义的:
(文件test.o 和文件main.o);
ld: 致命的: 文件处理错误。
无输出写到a.out
编译是过去了,但链接会发现该全局变量被多次定义了,链接是通不过的。
4.)如果定义的时候不初始化,在extern的时候初始化,会怎么样呢?
在main.c中
int ienum;
在test.c中
extern int ienum=8;
使用pc-lint敏结果如下:
PC-lint for C/C++ (NT) Ver. 8.00i, Copyright Gimpel Software 1985-2002
--- Module: E:\tool\test.c
_
extern int ienum=8;
E:\tool\test.c 1 Warning 509: extern used with definition
他说extern中使用了定义,但报的警告,说明编译允许,但理解从声明变为了定义!
编译,执行,结果如下:
$ cc test.c main.c
test.c:
main.c:
$ a.out
pre value is:8
later value is:9
结果已经和我们当初的设计背道而驰了!
综上,建议使用标准语法,定义的地方初始化,声明的地方仅仅声明,不要赋值!
5.)那如果按照上述规则声明,随后赋值呢?
extern int ienum;
ienum=8;
void test(void)
{
ienum ++;
}
Pc-lint检查如下:
PC-lint for C/C++ (NT) Ver. 8.00i, Copyright Gimpel Software 1985-2002
--- Module: E:\tool\test.c
_
ienum=8;
E:\tool\test.c 2 Error 129: declaration expected, identifier 'ienum' ignored E:\tool\test.c 2 Error 19: Useless Declaration
编译执行:
$ cc test.c main.c
test.c:
"test.c", line 2: warning: old-style declaration or incorrect type for: ienum main.c:
$ a.out
pre value is:8
later value is:9
简直是乱七八糟,千万不要这么用!。