在C中隐式声明函数和警告的含义是什么? [英] What are the implications of having an "implicit declaration of function" warning in C?

查看:0
本文介绍了在C中隐式声明函数和警告的含义是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

正如问题所述,具有"隐式函数声明"警告的确切含义是什么?我们刚刚调高了GCC身上的警告标志,发现了相当多的这些警告的例子,我很好奇在修复它们之前,这可能会导致什么类型的问题?

另外,为什么这是一个警告而不是一个错误。GCC怎么能成功链接到这个可执行文件呢?正如您在下面的示例中看到的,可执行文件的功能与预期一致。

以以下两个文件为例:

文件1.c

#include <stdio.h>

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

文件2.c

#include <stdio.h>

void funcA(void)
{
   puts("hello world");
}

编译输出(&A)

$ 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并且有固定数量的参数,并且没有原型),并且您总是使用正确的参数数量和类型调用它,则没有负面影响(除了不好的、过时的风格)。

ie,在上面的代码中,该函数被声明为:

int funcA();

由于此与函数定义不匹配,因此从file1.cfuncA()的调用会调用未定义的行为,这意味着它可能会崩溃。在您的体系结构上,使用您当前的编译器,它显然不会改变--但是体系结构和编译器会发生变化。

GCC之所以能够链接它,是因为当函数类型改变时,代表函数入口点的符号不会改变(再次...在您当前的体系结构上,使用您当前的编译器-尽管这是非常常见的)。

正确声明您的函数是一件好事--如果没有其他原因,它允许您为您的函数提供原型,这意味着如果您使用错误的参数数量或类型调用它,编译器必须诊断它。

这篇关于在C中隐式声明函数和警告的含义是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆