在C中不使用函数原型有什么好处吗?

我正在使用一些不包含某类函数的函数原型的C代码。 不使用函数原型有什么好处吗? 这些函数从不相互调用,也没有参数。 代码变化很大,所以也许它只需要编辑一行?

函数原型用于外部函数。 我的规则是每个非静态函数都得到一个原型,除了main()。 我使用’-Wmissing-prototypes’GCC选项。 通常它捕获的是当我忘记声明一个函数静态时。

另外,用C语言声明函数:

void function(void); 

而不是这样:

 void function(); 

因为第二种方式意味着该函数采用了未指定数量的参数,这不是您想要的(它与ANSI C之前的兼容性)。

而且我不知道它是否在严格的情况下是合法的。

应用于函数原型的“代码变化很大”也是一个糟糕的代码味道。 如果接口(函数签名)发生了很大变化,那么函数的职责可能不太清楚。 首先要弄清楚如何将问题划分为次要职责,并且只有在开始编写代码之后。

“所以也许只需要少一行来编辑?”

在这种情况下,这是唯一可能的“好处”,即懒惰。

更少的代码改变是我能想到的唯一“优势”。 通常这只是’懒惰’

无论如何,缺点更为重要:你必须在一个源文件中拥有所有function; 源文件中的函数顺序现在很重要,等等。另外,其他人会看到/为头文件混淆…最佳实践是.c和.h它。

我看到的唯一好处是,每次更改函数本身时都不必更新函数原型。

代码变化很大,所以也许它只需要编辑一行?

我猜这就是原因。 我想不出任何其他原因 – 编译速度(实际上)也没有改变,执行时间也没有,只是更新代码的时间。

我能想到的唯一优势是它可以节省你必须将函数的第一行复制并粘贴到.c或.h文件的prototypes部分。

对于其他文件中引用的函数,您别无选择,只能拥有原型。

对于具有文件范围的函数(即静态函数),将所有原型放在文件顶部的块中是有用的。 这样,任何静态函数都可以从该文件中的任何位置调用。 如果没有原型,函数A()只能在代码中声明B()之上调用函数B()。

此外,如果范围内没有原型,一些编译器会对参数做出不安全的假设。

此外,如果您编写的代码必须符合MISRA-C,则要求所有函数都在范围内具有原型。

我还提倡确保原型包含参数名称,而不仅仅是它们的类型(这是合法的),因为它只是通过查看原型来阐明参数的用途。

它打字较少,因此可能会降低您的RSI风险。