问答详情
源自:5-13 内部函数与外部函数

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呀。

提问者:T松子 2020-02-10 09:51

个回答

  • 靠一手自学成才
    2020-02-29 20:39:31

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

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

  • qq_慕无忌0538589
    2020-02-10 17:23:51

    正解:

    http://img1.mukewang.com/5e4120bb00013ff811760357.jpg

    http://img2.mukewang.com/5e4120c60001437611550305.jpg


    疑惑:

    http://img.mukewang.com/5e4121070001e8e311060363.jpg

    http://img3.mukewang.com/5e4121100001df1211140307.jpg


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


  • qq_慕无忌0538589
    2020-02-10 17:14:50

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

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

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

    运行,成功。 

    问题在于 “引用”文件。


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

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

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

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