编译器警告范围内没有原型(prototype)定义的函数?

标签 c compiler-warnings lint gcc-warning function-prototypes

[问题的灵感来自 this answer 的评论线程.]

众所周知,从 C99 开始,调用未声明的函数是错误的,最好使用适当的原型(prototype)。

但是,除此之外,如果我定义范围内没有原型(prototype)声明的函数(可能包含在调用者正在使用的同一头文件中),我希望编译器发出警告。 (除非该函数是静态的,在这种情况下,所有这些都是没有意义的。)

原因应该很明显:如果 header 中有原型(prototype)声明,并且它被所有调用者包含,但它没有包含在定义函数的文件中,并且如果函数的实际定义在某种程度上与外部定义不同原型(prototype),那么代表调用者完成的所有原型(prototype)检查都是毫无值(value)的,而且实际上是适得其反的错误。有一个明显的错误,但根本不保证能被捕获。

有通用的编译器可以检查这个吗?我用 -Wall 尝试了 gcc 和 clang,但没有。 (我想 Gimpel lint —— 如果它仍然存在 —— 会做到这一点,但我没有副本。)

理想情况下,我希望它也坚持原型(prototype)存在于单独的头文件中,但那是不同的鱼,所以我不坚持它。 (这个附加规定的原因是,一些程序员被假设的警告消息困扰,可能会试图通过在包含定义的 .c 文件顶部键入外部原型(prototype)来消除它,这又会违背目的。)

最佳答案

如果您需要一个同时适用于 gcc 和 clang 的选项,那么您最好的选择可能是 -Wmissing-prototypes 。如 gcc 文档中所示,如果定义了全局函数并且满足以下任一条件,则会触发此操作:

  • 之前没有声明;或

  • 之前的声明没有原型(prototype)。

如果先前的声明与定义包含在同一文件中,它不会提示;也就是说,它不要求声明位于头文件中。

必须显式启用此选项;它既不能被 -Wall 启用,也不能被 -Wextra 启用。

不幸的是,gcc 只允许 C 和 Objective C 使用该选项;不适用于 C++(大概是因为 C++ 不允许非原型(prototype)函数声明)。对于 gcc,另一种可能性是 -Wmissing-declarations 。仅当之前没有声明时才会产生此警告;不报告先前没有原型(prototype)的声明(即 int foo();)。但它适用于 C 和 C++。同样,必须明确启用警告选项。

Clang 还有一个 -Wmissing-declarations 选项,但它的含义完全不同,并且会自动启用(即使没有 -W 选项)。例如,此选项控制对空声明 (int;)、空 typedef (typedef int;) 和不声明任何对象的未标记组合 ( >struct { int a; };)。 Gcc 还发出有关这些构造的警告,但没有明显的选项来启用或禁用这些警告。

关于编译器警告范围内没有原型(prototype)定义的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50401100/

相关文章:

我可以为自定义日志记录功能启用格式警告吗?

c# - 通用纯文本 linting 工具

c - 有人有使用 PC-Lint 和 Netbeans 或 MPLAB X IDE 的经验吗?

c - 点位置在 double 和整数之间转换

c - C 中的 Pi 近似值 - 为什么我得到的近似值结果为 0?

c++ - 无法找到请求的 Boost 库 Windows Cmake

c - PC-Lint(由 Gimpel 提供)如何跨多个模块查看?

c - 从程序集调用 C 函数 "exit"时是否必须清理堆栈?

c++ - 删除编译器警告的危险方法?

c++ - 针对 unsigned int 上的一元运算的编译器警告