函数的隐式声明
我刚刚通过使用头来组织我的代码,但正如我所做的那样,我得到了一个警告,在链接时会变成错误。函数的隐式声明
我有一个代码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
我需要做?
编辑:为了反映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 */
希望这会有所帮助, 最好的问候, 汤姆。
同样的错误**:(** – 2010-01-27 02:11:37
@ t0mm13b:优秀的答案,但我仍想知道“隐式函数声明”的含义是什么? – 2012-02-07 08:40:58
因为我的C有点生疏,但是C允许你将函数体放在标题中吗?我不记得它确实如此。尝试将Testing()和print()的定义移动到.c文件中?你也可以尝试编译为C++,看看是否修复它,如果你不需要/想要C。
C在头文件和代码文件之间没有区别。 他将#包括在.c文件中,所以没有区别,直接将其放入文件中。 – McPherrinM 2010-01-27 02:07:50
当然你可以把活动代码放在标题中。这只是一个糟糕的主意。 – dmckee 2010-01-27 02:09:11
谢谢澄清。我做了足够多的C++,它们之间的差异有时会变得模糊。 – Toji 2010-01-27 02:29:21
您已将test.h
纳入main.c
,而根据您的说法,您的声明位于test1.h
。请注意名称中的1
。
除此之外,正在编译test.c
和链接test.o
,而实际上你的文件的名称是test1.c
。再次注意名称中的1
。
编辑:现在您编辑了包含在main.c
中的文件的名称。编辑后可以安全地断言,大部分的症状你描述不possble与文件的最新版本。重新验证你在做什么,发布最新的诊断信息和/或发布实际代码。
不过,你编译和链接线指的是旧的文件名。
我无法重新创建您的问题。可正常工作,当我尝试编译一个Ubuntu机器上的代码(根据你的贴,我假设你正在使用。)
你确定的#include正确怎么回事?
尝试使用-E代替-c,看看整个代码编译器试图编译模样。
我唐诺什么造成这一点,但我现在只是有这个问题。 尝试删除.h文件,并将函数的声明放在.c文件本身的顶部。
在这种情况下,删除test1.h和放test1.c功能的声明中test1.c。 并在test.c中包含test1.c 您不会再收到该警告消息,也不会出现以下链接错误。
什么是“kernel.c”? – 2010-01-27 02:03:24
警告消息中的文件名与您显示的示例命令不匹配。所以,它显然不是你正在运行的代码。我们不知道你在做什么。发布一个我们可以编译的完整示例。另外,在头文件中定义函数是一个坏主意。 – 2010-01-27 02:07:02
对不便,我刚编辑。 – 2010-01-27 02:09:04