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

来源:5-13 内部函数与外部函数

T松子

2020-02-10 09:51

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回答

  • 靠一手自学成才
    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的关系


    慕的地919...

    如果把这两个程序拿去C++里面,能运行吗,我也没试过

    2020-02-29 14:40:04

    共 2 条回复 >

  • 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两者不用“引用”的语句时,二者有何联系呀,为何能共享外部函数/


    qq_慕仰8... 回复T松子

    就是说 在say()前面加上static就是为了防止 main()里面调用say()时,会发生混乱,mian()里面的say()不是调用的test.c里面的,而是上面#include引用的,是吧。

    2020-02-21 16:05:15

    共 2 条回复 >

C语言入门

C语言入门视频教程,带你进入编程世界的必修课-C语言

926206 学习 · 20797 问题

查看课程

相似问题