c语言中声明外部函数需要添加的关键字,C语言中声明和定义的区别——分析extern关键词。...

更新时间:2023-08-08 18:35:10 阅读: 评论:0

c语⾔中声明外部函数需要添加的关键字,C语⾔中声明和定义的区别——分析extern关键词。...
⼀直很迷惑C语⾔中的声明和定义的有些实践中的⽤法,说迷惑实践是因为声明和定义的概念上的区别是很明确的。
定义和声明的区别(主要针对变量):
定义是要为变量分配存储空间,还可以在定义的时候为变量指定初始值。在⼀个程序中,变量有且仅有⼀次定义。
声明⽤于向程序表明变量的类型和名字。定义包括声明:定义变量时我们声明了变量的类型和名字。可以使⽤extern关键字声明变量名⽽定义它。不定义变量的声明包括变量名,变量类型和变量类型前的关键字extern。
声明的迷惑,我们可不可以对⼀个局部变量进⾏多次声明,既然只要有了定义,我们就可以进⾏多次声明,那么局部变量定义之后是否可以多次声明,个⼈认为是不能对⼀个局部变量进⾏声明(除了定义时包含的声明外,是不能再做声明的), 因为再次声明的形式应该是extern 类型 变量名,但是extern本⾝的作⽤是针对全部变量声明的,所以不可以对局部变量使⽤extern。
速度与激情8什么时候上映
⽹上有些⼈说在全局变量 int a 和extern int a是⼀样的,因为编译器会默认给int a添加extern的,实质上
这⾥也很迷惑的。⾸先extern本⾝的意思是外部的,全局的意思,与internal对应,internal主要指的是局部变量,在函数外部定义的变量本⾝就是全局的,默认是extern 的,可以被其他⽂件访问,但是与extern int a写法中所含的意思是否⼀样还有待深究。
依据百科百度来说int a和extern int a 区别还是很⼤的,extern 置于函数或变量前,表⽰变量或函数的定义在别的⽂件(也可能本⽂件中),在链接的时候才会解析符号表,暂时不清楚,如果在同⼀个⽂件中先做extern声明,再定义,符号解析会不会特殊处理,当然如果不想了解太底层的话,可以明确在⼀个⽂件中先extern声明再定义,与不同⽂件中extern声明和定义的表现是⼀样的。
下⾯对变量先声明再定义的形式很像函数先定义后声明(唯⼀不同点是声明函数时我们经常省略掉extern关键字,是因为函数声明默认就是extern的),下⾯的代码在gcc下正常输出b的值。
#include
extern int b;
int main(void)
{
printf("%d\n", b);
return 0;
}
int b = 4;
我们来分析这三条语句有什么区别:
//都为全局变量
int a;
survive用法extern int a;
extern int a = 0;
int a直接定义全局变量,很明确的定义, extern int a仅仅只是声明,没有定义的情况下声明是会报错的。extern int a = 0定义a, 与int a = 0效果⼀样,但是在gcc下使⽤extern int a = 0和int  a = 0还是会有⼀个⼩⼩的却别,int a= 0是不会报错或警告,但是使⽤extern int a = 0会报警告, 但是表现效果是⼀样的。
#include
extern int a = 5;
andy lauint main(void)
{
printf("%d\n", a);
return 0;
}
//
警告信息: warning: 'a' initialized and declared 'extern' [enabled by default] extern int a = 5;
//但是下⾯extern int a = 0和int a = 0;出现了错误信息:
音标课件#include
extern int a = 5;
int main(void)
{
printf("%d\n", a);
return 0;
}
int a = 0;
何凯文四六级
warning:
'a' initialized and declared 'extern' [enabled by default]
extern int a = 5;
error: redefinition of 'a'
int a = 0
英语四六级词汇
note: previous definition of 'b' was here
extern int a= 5;
在给读者看这样⼀段代码:
#include
extern int a = 5;
int main(void)
ucan{
printf("%d\n", a);
return 0;
}
int a;
以我们上⾯的分析, 编译时应该出现变量a redifition(重定义)的错误,但编译结果出来时,可以有些初学者会很迷惑居然没有报错,只是对extern int a = 5进⾏了警告。为什么会与我们上⾯分析的结果不同呢,其实这⾥涉及到了C语⾔的另⼀种机种,强符号与弱符号,强符号和弱符号都是针对全局变量⽽定,何谓强符号,何谓弱符号,强符号是定义的时候初始化,弱符号定义时未初始化,在C语⾔中对于相同变量进⾏定义,要求只能存在⼀个强符号,允许弱符号的存在,所有上⾯代码中两句全局变量的声明int a = 0;
int a;也是不会报错的,关于强符号和弱符号的详细知识可以参详《程序员⾃我修养》关于强符号和弱符号章节。
通过上⾯的分析,我们总结如下:
1、局部变量基本就是定义时包含声明,应该没有定义后还有声明的情况(⾄少我⾃⼰想不到特殊的情况,因为声明是需要使⽤extern的,⽽extern是针对全局变量的)
1、extern是针对全局变量和全局函数的。
2、⾮static全局函数默认是extern的(为什么要把static有extern区分开, 有说法是static和extern是⽔后
不相容的,也就是说extern是可以被外部⽂件访问,但是static相反会将访问限制在本⽂件中)
3、在我们读代码的时候全局变量int a = 0 和 extern int a = 0表现效果是⼀样的,但是对仅仅是extern int a这样的声明,⼀定要在其他⽂件或本⽂件的其他地⽅存在定义,也就是做最后符号链接时⼀定要有其他地⽅进⾏定义。
读者可以对⽐函数和全局变量的extern性质,他们是很相似的,它们之间⼀个⼤的区别应该是exter int tt和int tt, 其中tt既可以表⽰函数名也可表⽰变量名,对于函数来说都是声明,因为默认加extern,但是对于变量来说⽆extern时定义,加extern是声明。
看⼀下,我随机想出来的⼏个变量声明和定义,是否合理正确:
int a;
int main()
{
int a;
新东方名师
hockey}
分析:正确,但是涉及的作⽤域覆盖问题,main函数内的变量a和全局变量a是不同的变量。
----------------------------------
int a;
int main()ra
{
exteran int a;
}
分析:正确,extern int a声明的变量a就是全局变量定义的a,其实在main⾥⾯不作声明也是可以直接使⽤全局变量a的,这⾥⾯也是因为作⽤域的问题。
----------------------------------
extern int a;
int main()
{
int a;
}
分析:是否通过主要看a是否在其他⽂件中有定义,因为extern int a只是做了声明,⽽main函数⾥的变量a其实与extern int a声明的变量a 是没有关系的。
-----------------------------------
extern int a
int main()
{
extern int a;
}
分析:是否通过主要看a是否在其他⽂件中有定义,extern int a声明的变量a就是全局变量声明的a,其实在main⾥⾯不作声明也是可以直接使⽤全局变量a的,这⾥⾯也是因为作⽤域的问题。
分析下⾯语句的正确性(主要有⾃⼰的分析过程,下⾯都是正确的):
extern int pi = 4;当这条声明位于函数外部时,并且含有初始化式时,才算定义了pi, 并分配了存储空间。但是在函数体内则报错。extern 是外部的意思,外部变量只能定义在函数外部。
extern应⽤场合:任何在多个⽂件中使⽤的变量都需要与定义分离的声明。在这种情况下,⼀个⽂件含有变量的定义,使⽤该变量的其他⽂件则包含该变量的声明(⽽不是定义), 因为变量须且仅能定义⼀次,⽽变量的声明可以多次。

本文发布于:2023-08-08 18:35:10,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/78/1128123.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:声明   定义   变量   符号   函数   分析
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图