第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

問(wèn)下兩個(gè)程序的關(guān)系

我是不是可以理解為hello.c里面包括了test.c所以say()函數(shù)可以直接調(diào)用,又因?yàn)閠est.c里面沒(méi)有包括hello.c,因此要將printline()定義為外部函數(shù)。那么,如果在test.c里面Include<hello.c>是否可以直接調(diào)用?

正在回答

4 回答

補(bǔ)充:extern的主要作用不在于定義外部變量或函數(shù),而在于引用定義,如果在其他編譯器中去掉#include”test.c",不然會(huì)出現(xiàn)重定義(例如visual studio)。

0 回復(fù) 有任何疑惑可以回復(fù)我~

因?yàn)槲募ello.c的printLine()函數(shù)和test.c中的say()函數(shù)是被相互引用的,因此這兩個(gè)函數(shù)都應(yīng)為外部函數(shù),在兩個(gè)文件中都必須聲明引用。所以小編的答案是錯(cuò)誤的!具體代碼如下:

hello.c文件中:

#include <stdio.h>
#include "test.c"?? //引用test.c文件
extern void say();
void printLine()???? //這里定義的方法對(duì)嗎?
{
?? 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();
}


0 回復(fù) 有任何疑惑可以回復(fù)我~
#1

alice2333

不能運(yùn)行 Dev C++報(bào)錯(cuò)了
2017-10-28 回復(fù) 有任何疑惑可以回復(fù)我~

這里面的錯(cuò)誤可不只是在hello.c的第三行,寫(xiě)這代碼的人似乎沒(méi)搞明白什么是頭文件...

首先你要明白:include是個(gè)預(yù)處理指示,代碼在編譯前會(huì)將被include的文件內(nèi)容寫(xiě)入進(jìn)來(lái)。

所以實(shí)際上say函數(shù)也是定義在hello.c中的,那么問(wèn)題來(lái)了:在say中調(diào)用了printLine,但前面沒(méi)有printLine函數(shù)的聲明! 這是不應(yīng)該的。不過(guò)因?yàn)镃有隱式聲明的特性,所以編譯器不會(huì)在這里報(bào)錯(cuò),它會(huì)為printLine自動(dòng)推導(dǎo)出一個(gè)函數(shù)聲明。

可下面的代碼就是?static void printLine() 這個(gè)函數(shù)定義!這與前面編譯器自動(dòng)推導(dǎo)出的函數(shù)聲明沖突了! 而且static屬性與自動(dòng)推導(dǎo)的非static聲明嚴(yán)重沖突,編譯器會(huì)就此報(bào)錯(cuò)!

再后面的main就別看了...

這題目的意思似乎是讓你把第三行的static去掉(或是換成extern),這樣確實(shí)能編譯通過(guò)。但仍然存printLine函數(shù)聲明沖突的問(wèn)題!最終仍能編譯通過(guò)是因?yàn)榫幾g器忽略了自動(dòng)推導(dǎo)的版本而接受了代碼中的版本(在兩個(gè)版本都是非static的情況下)。 但你要明白,這沒(méi)有解決原本的問(wèn)題!問(wèn)題的根源出在:say函數(shù)前沒(méi)有printLine的聲明!


其實(shí)這樣的代碼是誤用了“include頭文件”的功能。

正確的做法是:被include的文件都應(yīng)該是所謂的“頭文件”,也就是只含有聲明的文件。 test.c中是say函數(shù)的定義,不應(yīng)直接包含到hello.c中。 應(yīng)該將say函數(shù)的聲明寫(xiě)到另一個(gè)test.h中,再在hello.c中include <test.h>

另外頭文件中還必須要做“重復(fù)包含保護(hù)”,顯然被include的test.c中也沒(méi)有這樣做。

你明白“編譯”“鏈接”等概念的話,會(huì)更能理解為什么要這樣做。


那么本課用這樣的代碼作示例是非常不恰當(dāng)?shù)模?要么是講師也不懂,要么就是想把學(xué)生搞得更糊涂......

7 回復(fù) 有任何疑惑可以回復(fù)我~
#1

super珊__

講了一大堆 還是不懂是什么問(wèn)題
2015-12-14 回復(fù) 有任何疑惑可以回復(fù)我~
#2

onemoo 回復(fù) super珊__

簡(jiǎn)單地說(shuō),你可以認(rèn)為:題目中這樣組織代碼的方式是錯(cuò)誤的。
2015-12-14 回復(fù) 有任何疑惑可以回復(fù)我~
#3

俠客島的含笑

意思是要一個(gè)test.h來(lái)聲明say,再通過(guò)一個(gè)test1來(lái)聲明say,然后再在hello.h中include<test1.h>來(lái)使用嗎??
2016-02-21 回復(fù) 有任何疑惑可以回復(fù)我~
#4

onemoo 回復(fù) 俠客島的含笑

不需要test1啊。 在 test.h 中聲明 say(),然后在 hello.h 中 include "test.h" 即可
2016-03-08 回復(fù) 有任何疑惑可以回復(fù)我~
查看1條回復(fù)

程序呢?

0 回復(fù) 有任何疑惑可以回復(fù)我~

舉報(bào)

0/150
提交
取消

問(wèn)下兩個(gè)程序的關(guān)系

我要回答 關(guān)注問(wèn)題
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)