簡體   English   中英

隱式功能聲明

[英]Implicit Declaration Of Function

我只是通過使用標頭來組織代碼,但是正如我這樣做時,我得到一個警告,鏈接時變成了錯誤。

我在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:〜/ Development / Test $ gcc -o test.o -c test.c -Wall -Wextra -nostdlib -nostartfiles -nodefaultlibs
test.c:在函數“ main”中:
test.c:11:警告:函數“測試”的隱式聲明
ubuntu @ eeepc:〜/開發/測試$

當時這只是一個簡單的警告,但是當我嘗試鏈接它時...

ubuntu @ eeepc:〜/ Development / Test $ ld -T linker.ld -o kernel.bin loader.o test.o
test.o:在函數main':
test.c:(.text+0xfc): undefined reference to
main':
test.c:(.text+0xfc): undefined reference to
main':
test.c:(.text+0xfc): undefined reference to
Testing的main':
test.c:(.text+0xfc): undefined reference to

我需要做什么?

編輯:為了反映OP的問題,盡管遭到了投票支持,但我還是刪除了一些答案...

為什么即使在此未提及kernel.c,在編譯器中也將其標記出來? 我錯過了什么嗎?

 
 
 
  
  \n
 
   
  
  
    gcc -o test.o -c test.c -Wall -Wextra -nostdlib -nostartfiles -nodefaultlibs 
   
 
 
  
  \n
 
   
  
  
    kernel.c:在函數“ main”中: 
   
 
 
  
  \n
 
   
  
  
    kernel.c:11:警告:函數“測試”的隱式聲明 
   
 
 
  
  \n
 
   
  
  
    ubuntu @ eeepc:〜/開發/測試$ 
   
 
 
  
  \n
 
  

也許您需要在頭文件中的某處執行此操作,因為我正在判斷您是否希望內核訪問此功能:

extern void Testing();

並且,取出所有功能並將它們放置在單獨的.c文件中,它們不應該放在第一位...例如:

Testing.c
/* all your functions here */

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

希望這對您有所幫助,湯姆,謝謝。

我無法重提您的問題。 當我嘗試在Ubuntu機器上編譯您的代碼時,這可以按預期工作(根據您的粘貼,我假設您正在使用。)

您確定#include正確執行嗎?

嘗試使用-E而不是-c來查看編譯器試圖編譯的整個代碼的外觀。

這里有些暗處,因為我的C有點生銹,但是C允許您將函數體放在標頭中嗎? 我不記得是這樣。 嘗試將Testing()和print()的定義移動到.c文件中? 您也可以嘗試使用C ++進行編譯,以查看是否可以解決該問題,如果不需要/不需要C。

您將test.h包含在main.c ,而根據您的編寫,您的聲明位於test1.h 注意名稱中的1

除此之外,您還要編譯test.c並鏈接test.o ,而實際上,文件名是test1.c 同樣,請注意名稱中的1

編輯:現在,您已編輯main.c包含的文件的名稱。 編輯之后,可以斷言您描述的大多數症狀不是文件的當前版本所可能的。 重新驗證您在做什么,發布更新的診斷信息和/或發布真實代碼。

盡管如此,您的編譯器和鏈接器行仍引用舊文件名。

我不知道是什么原因引起的,但是我現在有這個問題。 嘗試刪除.h文件,並將函數的聲明放在.c文件本身的頂部。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM