弃用老式声明与定义
6.11.3 ID_oldStyleParamList
在 C 语言的早期阶段,函数类型、参数类型以及参数列表的声明均可以被省略,这种特性使编译器难以检查相关错误,也会使代码难以阅读和维护。
示例:
int foo(); // Non-compliant
int bar(x); // Non-compliant
int i = 0;
foo();
foo(i); // Which is right?
bar(i);
bar(&i); // Unable to check error
例中 foo 函数并不是没有参数,而是未声明参数,bar 函数只声明了参数名称,如果传入的参数与实际定义不符会导致未定义的行为。
应采用“原型声明”,明确声明函数的参数列表和返回类型:
int foo(void); // Compliant
int bar(int* x); // Compliant
相应的老式定义也不应再继续使用,如:
int bar(x) int* x; { // Non-compliant
....
}
相关
依据
ISO/IEC 9899:1999 6.11.6(1)-deprecated
ISO/IEC 9899:1999 6.11.7(1)-deprecated
ISO/IEC 9899:2011 6.11.6(1)-deprecated
ISO/IEC 9899:2011 6.11.7(1)-deprecated
参考
MISRA C 2004 16.6
MISRA C 2012 8.2
SEI CERT EXP37-C