問下兩個程序的關系
我是不是可以理解為hello.c里面包括了test.c所以say()函數(shù)可以直接調用,又因為test.c里面沒有包括hello.c,因此要將printline()定義為外部函數(shù)。那么,如果在test.c里面Include<hello.c>是否可以直接調用?
我是不是可以理解為hello.c里面包括了test.c所以say()函數(shù)可以直接調用,又因為test.c里面沒有包括hello.c,因此要將printline()定義為外部函數(shù)。那么,如果在test.c里面Include<hello.c>是否可以直接調用?
2015-11-17
舉報
2016-01-22
補充:extern的主要作用不在于定義外部變量或函數(shù),而在于引用定義,如果在其他編譯器中去掉#include”test.c",不然會出現(xiàn)重定義(例如visual studio)。
2016-01-22
因為文件hello.c的printLine()函數(shù)和test.c中的say()函數(shù)是被相互引用的,因此這兩個函數(shù)都應為外部函數(shù),在兩個文件中都必須聲明引用。所以小編的答案是錯誤的!具體代碼如下:
hello.c文件中:
#include <stdio.h>
#include "test.c"?? //引用test.c文件
extern void say();
void printLine()???? //這里定義的方法對嗎?
{
?? printf("**************\n");??
}
int main()
{
??? say();
??? return 0;
}
test.c文件中:
#include <stdio.h>
extern void printLine();
void say(){
??? printLine();
??? printf("I love imooc\n");
??? printf("good good study!\n");
??? printf("day day up!\n");
??? printLine();
}
2015-11-17
這里面的錯誤可不只是在hello.c的第三行,寫這代碼的人似乎沒搞明白什么是頭文件...
首先你要明白:include是個預處理指示,代碼在編譯前會將被include的文件內容寫入進來。
所以實際上say函數(shù)也是定義在hello.c中的,那么問題來了:在say中調用了printLine,但前面沒有printLine函數(shù)的聲明! 這是不應該的。不過因為C有隱式聲明的特性,所以編譯器不會在這里報錯,它會為printLine自動推導出一個函數(shù)聲明。
可下面的代碼就是?static void printLine() 這個函數(shù)定義!這與前面編譯器自動推導出的函數(shù)聲明沖突了! 而且static屬性與自動推導的非static聲明嚴重沖突,編譯器會就此報錯!
再后面的main就別看了...
這題目的意思似乎是讓你把第三行的static去掉(或是換成extern),這樣確實能編譯通過。但仍然存printLine函數(shù)聲明沖突的問題!最終仍能編譯通過是因為編譯器忽略了自動推導的版本而接受了代碼中的版本(在兩個版本都是非static的情況下)。 但你要明白,這沒有解決原本的問題!問題的根源出在:say函數(shù)前沒有printLine的聲明!
其實這樣的代碼是誤用了“include頭文件”的功能。
正確的做法是:被include的文件都應該是所謂的“頭文件”,也就是只含有聲明的文件。 test.c中是say函數(shù)的定義,不應直接包含到hello.c中。 應該將say函數(shù)的聲明寫到另一個test.h中,再在hello.c中include <test.h>
另外頭文件中還必須要做“重復包含保護”,顯然被include的test.c中也沒有這樣做。
你明白“編譯”“鏈接”等概念的話,會更能理解為什么要這樣做。
那么本課用這樣的代碼作示例是非常不恰當?shù)模?要么是講師也不懂,要么就是想把學生搞得更糊涂......
2015-11-17
程序呢?