【发布时间】:2018-03-16 18:41:32
【问题描述】:
我想知道为什么 MISRA:2012 需要函数原型。在下面的示例中,这两个原型并不是真正需要的。
#include <stdio.h>
#include <stdlib.h>
// >>> Truly useless in my opinion
void display(void);
int main(void);
// <<<
void display(void) {
printf("Hello World!\n");
}
int main() {
display();
return EXIT_SUCCESS;
}
我可以在here 等 SO 上阅读的基本原理对我来说不是很清楚。例如,如果main 在声明之前尝试访问display,编译器或静态分析器将引发错误:在声明之前使用函数显示。
换句话说,为这个 MISRA 规则创建一个偏差是个好主意吗?
【问题讨论】:
-
我认为:1)这意味着您可以在不破坏代码的情况下对函数进行排序,2)它避免了对隐式声明的任何回归。
-
恕我直言,这完全没有实际意义,现代编译器会警告您隐式函数声明。但是您有动机:使用“坏”编译器或错误的编译器设置,您可能会通过重新排序函数来引入未被注意到的错误。始终拥有原型可以防止这种情况发生。
-
我的建议:启用所有警告 -Wall、-Wextra。现在您可以忘记静态分析工具中的一半规则。
-
那段代码还是很糟糕的,因为
display()没有被声明为static,如果意图是函数是它所在文件的本地函数,它当然应该是这样。 -
@nowox 函数本身充当原型。 直到代码被重新排序并且它没有。 如果 foo 只在同一个翻译单元中使用,则必须在使用前声明它。 这不是真的。并非所有 C 编译器都需要原型才能调用函数。旧版 C 代码甚至可能无法在较新的标准下编译。再说一遍:想想传递给没有原型的函数的参数会发生什么。