C 在本地声明和定义的函数
我有两个c文件: main.cC 在本地声明和定义的函数,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查
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。解决了的。现在收到警告。不是错误。没有正确地包含该文件。