C 代码中参数列表如果为空应声明为“(void)”
6.5.6 ID_missingVoid
在 C 语言中,如果将函数的参数列表声明为空括号,表示参数的声明被省略,而不是没有参数,这很容易使人误解,没有参数的参数列表应声明为“(void)”。
示例:
// In a.h
int foo(); // Non-compliant
// In a.c
#include "a.h"
int foo(int a) {
return a + 1;
}
// In main.c
#include <stdio.h>
#include "a.h"
int main() {
printf("%d\n", foo(1)); // Output: 2
printf("%d\n", foo()); // Can be compiled, but what is output?
}
例中 foo(1) 和 foo() 两种调用都可以通过编译,然而声明与实现不一致的问题总是令人困惑的,如果明确将参数声明为 void 或 int a 则可以解决这种问题。
应改为:
int foo(void); // Compliant, ‘foo(1)’ cannot be compiled
或者:
int foo(int a); // Compliant, ‘foo()’ cannot be compiled
相关
依据
ISO/IEC 9899:1999 6.7.5.3(14)
ISO/IEC 9899:1999 6.11.6(1)-deprecated
ISO/IEC 9899:2011 6.7.6.3(14)
ISO/IEC 9899:2011 6.11.6(1)-deprecated
参考
MISRA C 2004 16.5
MISRA C 2012 8.2