2010-01-27 108 views
-1

我剛剛通過使用頭來組織我的代碼,但正如我所做的那樣,我得到了一個警告,在鏈接時會變成錯誤。函數的隱式聲明

我有一個代碼test.c(使用的函數是一個水箱內的)是這樣的:

#include "test1.h" 

/* Some code */ 
main() 
{ 
    Testing(); 
} 

而且我test1.h標題是這樣的:

void Testing(); 
void print(int, int, int, const char*); 

而在test1.c

void Testing() 
{ 
    print(0xF9, 27, 5, "\xC9\\xBB"); 
} 

void print(int colour, int x, int y, const char *string) 
{ 
    volatile char *video=(volatile char*)0xB8000 + y*160 + x*2; 
    while(*string != 0) 
    { 
     *video=*string; 
     string++; 
     video++; 
     *video=colour; 
     video++; 
    } 
} 

當我嘗試編譯代碼時,我得到這個:

Ubuntu的@ EeePC的:〜/開發/測試$ gcc的-o test.o -c test.c的-Wall -Wextra -nostdlib -nostartfiles -nodefaultlibs
test.c的:在功能上的主要「:
test.c以11:警告:隱函數聲明 '測試'
Ubuntu的@ EeePC的:〜/開發/測試$

在它只是一個簡單的警告的時間,但是當我嘗試連接它...

Ubuntu的@ EeePC的:〜/開發/測試$ LD-T linker.ld -o kernel.bin loader.o test.o
test.o:在功能main':
test.c:(.text+0xfc): undefined reference to
測試」

我需要做?

+0

什麼是「kernel.c」? – 2010-01-27 02:03:24

+1

警告消息中的文件名與您顯示的示例命令不匹配。所以,它顯然不是你正在運行的代碼。我們不知道你在做什麼。發佈一個我們可以編譯的完整示例。另外,在頭文件中定義函數是一個壞主意。 – 2010-01-27 02:07:02

+0

對不便,我剛編輯。 – 2010-01-27 02:09:04

回答

1

編輯:爲了反映OP的問題, ..

爲什麼在編譯器中標記爲kernel.c,即使你沒有在這裏提到它?我缺少的東西...

 
gcc -o test.o -c test.c -Wall -Wextra -nostdlib -nostartfiles -nodefaultlibs 
kernel.c: In function ‘main’: 
kernel.c:11: warning: implicit declaration of function ‘Testing’ 
[email protected]:~/Development/Test$ 

也許你需要的地方做它在你的頭文件這種方式,因爲我判斷你想要的內核訪問此功能:

 
extern void Testing(); 

而且,拿出你所有的功能,並把它們放在一個單獨的.c文件中,它們不應該在那裏放在第一位...例如:

 
Testing.c 
/* all your functions here */ 

Testing.h 
/* Only global, external variables and function prototypes */ 

希望這會有所幫助, 最好的問候, 湯姆。

+0

同樣的錯誤**:(** – 2010-01-27 02:11:37

+1

@ t0mm13b:優秀的答案,但我仍想知道「隱式函數聲明」的含義是什麼? – 2012-02-07 08:40:58

0

因爲我的C有點生疏,但是C允許你將函數體放在標題中嗎?我不記得它確實如此。嘗試將Testing()和print()的定義移動到.c文件中?你也可以嘗試編譯爲C++,看看是否修復它,如果你不需要/想要C。

+2

C在頭文件和代碼文件之間沒有區別。 他將#包括在.c文件中,所以沒有區別,直接將其放入文件中。 – McPherrinM 2010-01-27 02:07:50

+3

當然你可以把活動代碼放在標題中。這只是一個糟糕的主意。 – dmckee 2010-01-27 02:09:11

+0

謝謝澄清。我做了足夠多的C++,它們之間的差異有時會變得模糊。 – Toji 2010-01-27 02:29:21

0

您已將test.h納入main.c,而根據您的說法,您的聲明位於test1.h。請注意名稱中的1

除此之外,正在編譯test.c和鏈接test.o,而實際上你的文件的名稱是test1.c。再次注意名稱中的1

編輯:現在您編輯了包含在main.c中的文件的名稱。編輯後可以安全地斷言,大部分的症狀你描述不possble與文件的最新版本。重新驗證你在做什麼,發佈最新的診斷信息和/或發佈實際代碼。

不過,你編譯和鏈接線指的是舊的文件名。

1

我無法重新創建您的問題。可正常工作,當我嘗試編譯一個Ubuntu機器上的代碼(根據你的貼,我假設你正在使用。)

你確定的#include正確怎麼回事?

嘗試使用-E代替-c,看看整個代碼編譯器試圖編譯模樣。

0

我唐諾什麼造成這一點,但我現在只是有這個問題。 嘗試刪除.h文件,並將函數的聲明放在.c文件本身的頂部。

在這種情況下,刪除test1.h和放test1.c功能的聲明中test1.c。 並在test.c中包含test1.c 您不會再收到該警告消息,也不會出現以下鏈接錯誤。