考虑以下代码,这会导致一种奇怪的行为:
#ifndef FOO_H
#define FOO_H
void foo();
#endif
#include <stdio.h>
// NOTICE - foo.h is not included!
void foo()
{
printf("foo!\n");
}
#include "foo.h"
int main()
{
foo();
return 0;
}
运行此代码我进入控制台:foo!
我在这里遇到的错误是我希望main.c
不熟悉foo()
的实施,因为foo.h
中不包含foo.c
,因此foo()
{1}}应该是foo.c
中的内部函数。当我在VS2010中运行它并且使用gcc(在Windows上)编译exe时,它发生在我身上。
谁能解释这个现象?我想到了它,我不知道它为什么会发生。感谢。
答案 0 :(得分:2)
头文件声明了该函数,因此在编译main.c时,编译器知道要验证的函数签名。在编译foo.c时,它不需要声明,因为它是函数的声明。由链接器决定是否存在任何未解析的符号,在这种情况下不存在,所以一切都很好,也是你看到这项工作的原因。
答案 1 :(得分:0)
如果上述问题中包含其他功能(test.c),会发生什么。
<强> foo.h中强>
#ifndef FOO_H
#define FOO_H
void foo();
#endif
<强> foo.c的强>
#include <stdio.h>
// NOTICE - foo.h is not included!
void foo()
{
printf("foo!\n");
}
<强> test.c的强>
#include <stdio.h>
void foo()
{
printf("foo!\n");
}
<强>的main.c 强>
#include "foo.h"
int main()
{
foo();
return 0;
}