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

2023-12-27

[问题受到评论线程的启发这个答案 https://stackoverflow.com/questions/50399128/functions-in-c-headers/50399252#50399252.]

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

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

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

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

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


如果您需要一个同时适用于 gcc 和 clang 的选项,那么您最好的选择可能是-W缺失原型 https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wmissing-prototypes。如 gcc 文档中所示,如果定义了全局函数并且满足以下任一条件,则会触发此操作:

  • 此前没有任何声明;或者

  • 之前的声明没有原型。

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

必须显式启用此选项;它既不被启用-Wall nor by -Wextra.

不幸的是,gcc 只允许 C 和 Objective C 的这个选项;不适用于 C++(大概是因为 C++ 不允许非原型函数声明)。对于 gcc,另一种可能性是-Wmissing-声明 https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wmissing-declarations。仅当之前没有声明时才会产生此警告;先前没有原型的声明(即int foo();)没有报道。但它适用于 C 和 C++。同样,必须明确启用警告选项。

铿锵还有一个-Wmissing-declarations选项,但它意味着完全不同的东西,并且它会自动启用(即使没有-W选项)。例如,此选项控制对空声明的投诉(int;), 空 typedef (typedef int;)和未标记的复合材料,不声明任何对象(struct { int a; };)。 Gcc 还发出有关这些构造的警告,但没有明显的选项来启用或禁用这些警告。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编译器警告范围内没有原型定义的函数? 的相关文章

随机推荐