避免隐式声明
6.11.1 ID_implicitDeclaration
在 C90 标准中,如果函数在没有事先声明或定义的情况下被调用,编译器会为其生成一个隐式声明,指定函数的返回类型为 int,但不指定参数类型和数量,如果与函数的实际定义不符会导致未定义的行为。
实践表明,隐式声明会隐藏错误,不是可靠的语言特性,已从后续标准中移除。
示例:
// In main.c
#include <stdio.h>
int main(void) {
double r = foo(); // Non-compliant
printf("%f\n", r);
}
调用 foo 函数前未对其进行声明,但仍可通过编译,如果 foo 函数的实际定义如下:
// In foo.c
double foo() {
return 1.23;
}
返回值将被解释成整型,使程序输出错误的结果。
依据
ISO/IEC 9899:1990 6.3.2.2-undefined
参考
MISRA C 2004 8.1
MISRA C 2012 17.3
SEI CERT DCL31-C