C 在本地声明和定义的函数

C 在本地声明和定义的函数,c,C,我有两个c文件: main.c int main() { foo(); return 0; } void foo(void); void foo(void) { printf("Hi"); } foo.c int main() { foo(); return 0; } void foo(void); void foo(void) { printf("Hi"); } 既然默认情况下所有函数都是extern,那么为什么不能main.c查

我有两个c文件:

main.c

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

void foo(void)
{ 
    printf("Hi");
}
foo.c

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

void foo(void)
{ 
    printf("Hi");
}
既然默认情况下所有函数都是
extern
,那么为什么不能main.c查找
foo()

函数原型->
void foo(void)未在foo.h中声明,它保留在foo.c

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

void foo(void)
{ 
    printf("Hi");
}
我得到一个错误:

对foo的未定义引用


编译此代码时。

C源文件是独立编译的。例如,当编译器处理
main.c
时,它对
foo.c
或任何其他文件中的内容一无所知,除非您实际引用了其他文件。

c源文件是独立编译的。例如,当编译器在处理
main.c
时,它对
foo.c
或任何其他文件中的内容一无所知,除非您实际引用了其他文件。

您的代码没有重大问题(有些人可能认为下面给出的警告是“重大的”)。您可能只是没有正确构建。但您可以通过以下方式构建:

$ gcc -c main.c
main.c: In function ‘main’:
main.c:4:5: warning: implicit declaration of function ‘foo’ [-Wimplicit-function-declaration]
     foo();
     ^~~
$ gcc -c foo.c
foo.c: In function ‘foo’:
foo.c:7:6: warning: implicit declaration of function ‘printf’ [-Wimplicit-function-declaration]
      printf("Hi");
      ^~~~~~
foo.c:7:6: warning: incompatible implicit declaration of built-in function ‘printf’
foo.c:7:6: note: include ‘<stdio.h>’ or provide a declaration of ‘printf’
$ gcc main.o foo.o
$ ./a.out
Hi$ 
$gcc-c main.c
main.c:在函数“main”中:
main.c:4:5:警告:函数“foo”的隐式声明[-Wimplicit函数声明]
foo();
^~~
$gcc-c foo.c
foo.c:在函数“foo”中:
foo.c:7:6:警告:函数“printf”的隐式声明[-Wimplicit函数声明]
printf(“Hi”);
^~~~~~
foo.c:7:6:警告:内置函数“printf”的隐式声明不兼容
foo.c:7:6:注意:包括“”或提供“printf”声明
$gcc main.o foo.o
美元/年
你好,美元

您的代码没有重大问题(有些人可能认为下面给出的警告是“重大的”)。您可能只是没有正确构建。但您可以通过以下方式构建:

$ gcc -c main.c
main.c: In function ‘main’:
main.c:4:5: warning: implicit declaration of function ‘foo’ [-Wimplicit-function-declaration]
     foo();
     ^~~
$ gcc -c foo.c
foo.c: In function ‘foo’:
foo.c:7:6: warning: implicit declaration of function ‘printf’ [-Wimplicit-function-declaration]
      printf("Hi");
      ^~~~~~
foo.c:7:6: warning: incompatible implicit declaration of built-in function ‘printf’
foo.c:7:6: note: include ‘<stdio.h>’ or provide a declaration of ‘printf’
$ gcc main.o foo.o
$ ./a.out
Hi$ 
$gcc-c main.c
main.c:在函数“main”中:
main.c:4:5:警告:函数“foo”的隐式声明[-Wimplicit函数声明]
foo();
^~~
$gcc-c foo.c
foo.c:在函数“foo”中:
foo.c:7:6:警告:函数“printf”的隐式声明[-Wimplicit函数声明]
printf(“Hi”);
^~~~~~
foo.c:7:6:警告:内置函数“printf”的隐式声明不兼容
foo.c:7:6:注意:包括“”或提供“printf”声明
$gcc main.o foo.o
美元/年
你好,美元

“为什么不能让main.c知道foo()?”-->
main()
可以知道
foo()
main()
只需要一个正确的声明。我得到一个生成错误。代码中有什么错误?您是如何尝试生成的?如果您只是编译
main.c
,它就会工作。但是,如果您试图编译并链接以构建一个可执行文件而不包含
foo.o
,它将失败。“为什么main.c不能知道foo()?”-->
main()
可以知道
foo()
main()
只需要一个正确的声明。我得到一个生成错误。代码中有什么错误?您是如何尝试生成的?如果您只是编译
main.c
,它就会工作。但是,如果您试图编译并链接以构建一个可执行文件而不包含
foo.o
,那么它将失败。因此,除了将foo()的原型移动到foo.h并在Main.c中使用foo.h之外,没有其他方法了。您可以在这两个文件中手动声明
foo()
,但这样您就有可能犯错误并使声明不同,在这种情况下链接器会抱怨。或者你可以(但你真的不应该)依赖默认的原型,编译器给出了一个未声明的函数。我没有正确地包含该文件。因此,除了将foo()的原型移动到foo.h并在Main.ct中使用foo.h之外,没有其他方法。您可以在这两个文件中手动声明
foo()
,但这样您就有可能犯错误并使声明不同,在这种情况下链接器会抱怨。或者你可以(但你真的不应该)依赖默认的原型,编译器给出了一个未声明的函数。我没有正确地包含该文件。我正在使用代码块,它给了我一个errorYes。解决了的。现在收到警告。不是错误。没有正确地包含文件。im使用代码块,它给了我一个errorYes。解决了的。现在收到警告。不是错误。没有正确地包含该文件。