为了账号安全,请及时绑定邮箱和手机立即绑定

发现吧test.c中函数改为static就行了,为什么被引用的必须是static类型?

被引用的需被限定?

正在回答

3 回答

注意到第二个源文件也就是test.c【后面将用T代替】调用了第一个源文件hello.c【后面将用H代替】中的函数,因此我们先将H中被T调用的函数printLine()修改为外部函数也就是加上一个extern,这样T也就是一个正常的源文件了。   现在讨论两种情况:

A。当我们把T编译为静态函数的时候——static say()   ,我们在H若要使用T的这个静态函数,这需要将他调用过来,而一个静态函数是无法直接调用的,此时我们需要先引入say()函数所在的源文件,也就是H中的第二行代码的用意。     

B。当我们把T编译为动态函数的时候——say()或者extern say()【因为extern可以省略】,我们若要在H中使用T的这个函数say()那么我们可以直接调用,因为say()是一个外部函数,无需引入其所在的源文件T也就是不需要H的第二行,因此会有人说“只要把第二行注释掉就行了”其实这句话的前提是say()是一个外部函数。


0 回复 有任何疑惑可以回复我~

这里的static是对函数的作用范围的一个限定,限定该函数只能在其所处的源文件中使用,因此在不同文件中出现相同的函数名称的内部函数是没有问题的

1 回复 有任何疑惑可以回复我~

静态的   static



2 回复 有任何疑惑可以回复我~
#1

慕神6282746

因为hello.c中已经包含了test.c文件,可以直接用里面的函数,如果不加static的话,正如导师说的,say()函数就被默认为是extern类型的,那么既包含了test.c文件,又调用了say()函数,就等于重复调用了,所以会报错。你尝试一下,吧hello.c中的#include“test.c”去掉,在test.c中函数改为extern类型的,你会发现能够正常输出
2019-01-18 回复 有任何疑惑可以回复我~
#2

慕娘0415944 回复 慕神6282746

6666
2019-01-22 回复 有任何疑惑可以回复我~
#3

qq_慕斯2176059 回复 慕神6282746

原来如此!
2019-01-24 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

发现吧test.c中函数改为static就行了,为什么被引用的必须是static类型?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信