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

hello.c调用test.c的问题,为什么说是两个say()?

test.c调用了hello.c中的printLine(),这里好懂,因为printLine()声明为extern,可以被其他源文件调用。

hello.c中引用test.c然后调用test.c中的say()函数,为什么要把say()声明为static?这里不太懂。

既然是#include "test.c",相当于把test.c中的文件复制到了hello.c中,我直接调用say()应该是可以的呀,不用声明为static呀。

正在回答

3 回答

我是这样理解的:你在一个文件中调用另一个文件的函数有两种方法,一是使用#include预处理命令直接把整个文件包含进来;二是不适用#include预处理命令,直接把那个文件中要调用的函数设置为外部函数。

而这个题目的重复之处就在于他把两种方法都满足了,那么编译器就不知道到底是用哪种方法来进行函数调用,就产生了错误。

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

正解:

http://img1.sycdn.imooc.com//5e4120bb00013ff811760357.jpg

http://img1.sycdn.imooc.com//5e4120c60001437611550305.jpg


疑惑:

http://img1.sycdn.imooc.com//5e4121070001e8e311060363.jpg

http://img1.sycdn.imooc.com//5e4121100001df1211140307.jpg


想知道 hello.c和test.c的关系


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

T松子 提问者

以下是我的理解,我也不确定对不,你可以看一下讨论一下: hello.c和test.c中的extern方法能互相调用(在不引用的前提下,否则会冲突), 应该就像是把一个.c文件分成了两个.c文件,但这两.c文件还是遵循一个.c文件的规则,比如不能重复定义的函数。 然后c在此基础上添加了一些规则,比如每个文件中的函数,如果添加了static,就是这个文件特有。
2020-02-11 回复 有任何疑惑可以回复我~
#2

慕的地9191135

如果把这两个程序拿去C++里面,能运行吗,我也没试过
2020-02-29 回复 有任何疑惑可以回复我~

将hello.c里面的引用test.c去掉,

hello.c中printLine()函数前面不加extern (加不加都一样),只加void;

test.c中say()函数前面只加void(同上);

运行,成功。 

问题在于 “引用”文件。


引用文件,可能会出现函数名重复的情况咯。

因此在引用的文件里面要给引用的函数加static。

我也是小白,希望有大佬真的解释一下为啥。

定义的外部函数,为什么可以在 hello.c test.c 随意调用呢,换句话说,hello.c test.c两者不用“引用”的语句时,二者有何联系呀,为何能共享外部函数/


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

T松子 提问者

似乎明白了,我查了引用#include,它就是把引用的内容拷贝到这个位置, 相当于hello.c中#include"test.c"被替换成了test.c中的内容, 如果test.c中的say()不加static,那么在hello.c中就会又重新定义一个say()【因为引用复制过来的】,test.c和hello.c中的say()就冲突了, 所以如果引用,必须加static,加了static之后,hello.c调用的是自己文件中的say(),这样就不冲突了。
2020-02-11 回复 有任何疑惑可以回复我~
#2

qq_慕仰8138156 回复 T松子 提问者

就是说 在say()前面加上static就是为了防止 main()里面调用say()时,会发生混乱,mian()里面的say()不是调用的test.c里面的,而是上面#include引用的,是吧。
2020-02-21 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

hello.c调用test.c的问题,为什么说是两个say()?

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