2010-01-27 111 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 您不会再收到该警告消息,也不会出现以下链接错误。