正如问题所述,“隐式函数声明”警告究竟意味着什么?我们刚刚调高了 gcc 上的警告标志,发现了很多这些警告的实例,我很好奇在修复它们之前这可能会导致什么类型的问题?
另外,为什么这是一个警告而不是错误。 gcc 如何能够成功链接这个可执行文件?正如您在下面的示例中看到的,可执行文件按预期运行。
以下面两个文件为例:
file1.c
#include <stdio.h>
int main(void)
{
funcA();
return 0;
}
file2.c
#include <stdio.h>
void funcA(void)
{
puts("hello world");
}
编译输出
$ gcc -Wall -Wextra -c file1.c file2.c
file1.c: In function 'main':
file1.c:3: warning: implicit declaration of function 'funcA'
$ gcc -Wall -Wextra file1.o file2.o -o test.exe
$ ./test.exe
hello world
如果函数有一个与隐式声明匹配的定义(即它返回int
并且有固定数量的参数,并且没有原型),并且您总是使用正确数量和类型的参数来调用它,那么就不会产生任何负面影响(除了糟糕的、过时的风格)。
即,在上面的代码中,就好像该函数被声明为:
int funcA();
从此doesn't匹配函数定义、调用funcA()
from file1.c
调用未定义的行为,这意味着它可能会崩溃。在您的架构上,使用当前的编译器,显然不会 - 但架构和编译器会发生变化。
GCC 能够链接它,因为当函数类型更改时,表示函数入口点的符号不会更改(同样......在您当前的体系结构上,使用当前的编译器 - 尽管这很常见)。
正确声明你的函数是一件好事 - 如果没有其他原因,它允许你为你的函数提供一个原型,这意味着如果你使用错误数量或类型的参数调用它,编译器必须对其进行诊断。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)