gpt4 book ai didi

c - 为什么在 MISRA :2012? 中需要函数原型(prototype)

转载 作者:太空狗 更新时间:2023-10-29 16:10:24 24 4
gpt4 key购买 nike

我想知道为什么 MISRA:2012 需要函数原型(prototype)。在下面的示例中,这两个原型(prototype)并不是必需的。

#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;
}

我可以在 SO 上阅读的基本原理,例如 here我不是很清楚。例如,如果 main 尝试在声明之前访问 display,编译器或静态分析器将引发错误:函数显示在声明之前使用。

换句话说,为这个 MISRA 规则创建一个偏差是个好主意吗?

最佳答案

void display(void); 是函数前向声明。它具有原型(prototype)格式。

如发布的链接所示,函数原型(prototype) 是一个函数声明,其中指定了所有参数的类型。如果没有参数,那么参数列表必须是(void)(没有参数)而不是()(任何参数)。

确切的规则 8.2 说:

Rule 8.2 Function types shall be in prototype form with named parameters

提供的基本原理(阅读它,非常好)提到这是为了避免未指定所有参数的旧 K&R 和 C90 程序。 C99 在某种程度上仍然允许这样做,只要函数声明中的参数类型不与函数定义中的参数类型冲突。

本质上,该规则旨在禁止这些类型的功能:

void func1 (x)  // K&R style
int x;
{}

void func2(x) // sloppy style
{}

所有参数(如果有)都必须指定类型和名称。

但是,我在 MISRA-C 中找不到任何要求您为每个函数编写函数声明的内容。这意味着无论有无函数声明,您的示例代码都将符合此 MISRA 规则。


尽管正如我在之前的回答中提到的那样,编写没有函数声明(以原型(prototype)格式)的 .c 文件是草率的做法。如果您的函数需要按特定顺序调用,则应通过程序设计、函数命名和注释/文档使其显而易见。不是按照它们恰好在 .c 文件中声明的顺序。

在 .c 文件中声明函数的源代码行与该函数的行为/使用之间不应紧密耦合。

相反,函数应该按照逻辑上有意义的顺序定义。编写 .c 文件的一种常见方法是将所有在 .h 文件中声明了函数的公共(public)函数保留在 .c 文件的顶部。然后让内部函数(那些带有 static/internal linkage 的函数)放在底部。该模型需要所有内部函数的函数声明。另一种选择是将所有内部功能放在顶部,将公共(public)功能放在底部。只要你是一致的,任何一个都可以。

最重要的是,如果 .c 文件中的函数定义被重新排序,它不应该破坏程序或导致编译器错误。确保这一点的最简单方法是始终为程序中的每个函数提供函数声明。

请注意,文件顶部的函数声明根本不是“真正无用的”,因为它们提供了 C 文件中存在的所有函数的快速摘要。这是一种编写自文档化代码的方法。


请注意,作为一种特殊情况,C 标准不允许 main() 的原型(prototype)。

请注意,此外,规则 8.7 和 8.8 不允许您在没有 static 的情况下使用 void display(void),因为该函数仅在一个翻译单元中使用。

关于c - 为什么在 MISRA :2012? 中需要函数原型(prototype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46580644/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com