函数运行虽然标头不包括在内

时间:2017-05-15 14:43:03

标签: c include

考虑以下代码,这会导致一种奇怪的行为:

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");
}

的main.c

#include "foo.h"

int main()
{
    foo();
    return 0;
}

运行此代码我进入控制台:foo!

我在这里遇到的错误是我希望main.c不熟悉foo()的实施,因为foo.h中不包含foo.c,因此foo() {1}}应该是foo.c中的内部函数。当我在VS2010中运行它并且使用gcc(在Windows上)编译exe时,它发生在我身上。 谁能解释这个现象?我想到了它,我不知道它为什么会发生。感谢。

2 个答案:

答案 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;
}