hello.c中引用了test.c,test.c中包含默认的外部函数say(),即使修改了printLine()方法,还是会出错,将test.c中的say()方法改成静态的,则运行成功。貌似是既引用文件,又调用外部函数就会报错,但是一个文件中如果既有内部也有外部函数,且都需要调用的情况咋办?
static静态函数,(内部函数),在本原程序文件中使用。extern外部函数,可以被 其他文件所调用。。
我觉得2文件加不加static都可以
1文件的函数printLine前面要加extern,因为该函数要被2文件调用。这个程序就是1调用2,2调用1
楼主,我按你说的,2文件改为static后运行成功了,但是我在Dev c++上实验,2文件改为extern也可以,现在有点晕,就是先不管2文件中SAY函数是被调用又引用,先问你:2文件内被调用函数前面,是要写extern吗,还是1文件调用外部函数时printLine前面要加extern,你懂我意思吗,谢谢。
注意到第二个源文件也就是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()是一个外部函数。