C 函数运行时不包括标题

C 函数运行时不包括标题,c,include,C,Include,考虑以下代码,它会导致一种奇怪的行为: 福安 富科 运行控制台中的代码:foo 这里让我感到困扰的是,我希望main.c不会熟悉foo()的实现,因为foo.c中不包含foo.h,因此foo()应该是foo.c中的一个内部函数。我在VS2010中运行它时,以及在windows上使用gcc编译exe时,都遇到了这种情况。 有人能解释这种现象吗?我想了想,不知道为什么会这样。谢谢。头文件声明函数,因此在编译main.c时,编译器知道要验证的函数签名。编译foo.c时,不需要声明它,因为它是函数的声明

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

福安 富科 运行控制台中的代码:
foo

这里让我感到困扰的是,我希望
main.c
不会熟悉
foo()
的实现,因为
foo.c
中不包含
foo.h
,因此
foo()
应该是
foo.c
中的一个内部函数。我在VS2010中运行它时,以及在windows上使用gcc编译exe时,都遇到了这种情况。
有人能解释这种现象吗?我想了想,不知道为什么会这样。谢谢。

头文件声明函数,因此在编译main.c时,编译器知道要验证的函数签名。编译foo.c时,不需要声明它,因为它是函数的声明。这取决于链接器是否有任何未解析的符号,而在本例中没有,因此一切都很好,以及您看到此工作的原因。

如果上述问题中包含另一个函数(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");
}
#include <stdio.h>  
void foo()
{
    printf("foo!\n");
}
#include "foo.h"

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

Foo不需要了解自己就可以编译。
main
不熟悉
Foo.h
的实现
main
熟悉
foo
的定义。因此,编译器可以生成调用
foo
的代码,链接器最终会将其“粘”在一起。顺便说一句,您应该在
foo.c
中包含
foo.h
,即使这不是必需的,但它可能有助于防止错误。如果我在另一个头文件中以不同的方式实现
foo
,会发生什么(例如
bar.h
)?我得到一个链接错误?这是(显然,在使用Microsoft链接器时)什么是“预声明”的常见原因之一?标准只知道声明。C不支持方法。您对术语的使用非常混乱。请正确使用标准术语。这是一个问题吗?如果是,则在主要问题的注释中得到了回答-链接器不知道哪个
foo
是相关的,因此会出现链接错误…谢谢r回答我的问题。我认为不包含头是不好的做法。但是当暴露头时,你将所有函数和变量暴露到包含它的文件中。没有部分暴露。这是我的抱怨。。。
#include <stdio.h>
// NOTICE - foo.h is not included!

void foo()
{
    printf("foo!\n");
}
#include <stdio.h>  
void foo()
{
    printf("foo!\n");
}
#include "foo.h"

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