最近我了解到,在C中有一些可以为空的参数类型列表:
int print();
int main() {
print("hallo"); // << valid but highly unintuitive
}
int print() {
}
在这段代码中,可能有人忘记了编写print(void)
(可能是C++开发人员),但其他人提供了一个参数。编译不显示任何警告或错误:
$ make test -Wstrict-prototypes -Wimplicit -Wimplicit-function-declaration -Wall
cc test.c -o test
我没有找到一个编译器标志,它警告空参数类型列表,只警告隐式函数声明。
我能做些什么来帮助我找到给定代码库中参数类型列表的所有用途吗?
例如。
grep
ing (对我来说太复杂了:)发布于 2016-12-01 06:22:11
在gcc的帮助下,使用
-如果函数是声明或定义的,而没有指定参数类型,则警告--原型(C和Objective)。(如果前面有指定参数类型的声明,则允许在没有警告的情况下使用旧式函数定义。)
通过你的例子,它给出了:
hallo.c:1:5: warning: function declaration isn’t a prototype [-Wstrict-prototypes]
int print() {
^
但是,您必须确保正确定义现有代码中的所有非严格函数声明;特别是,没有参数的函数应该用(void)声明,如下所示:
int print(void);
发布于 2016-12-01 06:31:18
您的示例在C中和C++中都是无效的。由于您的print()
函数不接受任何参数--这是从您提供的函数定义(C2011,6.7.6.3/14)中很好地建立起来的--因此使用参数调用它是不一致的,无论在调用点是否可以看到原型(C2011,6.5.2.2/6)。如果调用出现在一个函数定义和任何真正的原型都不可见的作用域中,那么编译器可能仍然接受代码,但这并不使其有效,也不能保证它能够工作。
另外,你似乎使用了错误的术语,或者你的想法可能是非常错误的。参数类型列表是声明(和定义)函数的现代方法,包括函数原型:
int my_func(int a, char *b);
// ^^^^^^^^^^^^^^----- parameter-type-list
您应该而不是消除这些,但是我认为您的意思是要识别和修复K&R风格的函数定义,以及没有参数类型列表的函数声明。( K&R样式的形式语法是“标识符列表”,如果需要,还附带“声明列表”)。
至于自动识别K&R风格声明的出现,这是C语言解析器的一项工作,其中最常见的实现是C编译器。您的编译器可能有您想要的选项。例如,GCC有-Wstrict-prototypes
和-Wold-style-defintion
选项,这两种选项将同时表示非原型的函数声明和K&R风格的函数定义。GCC还有其他一些你可能也感兴趣的选择,比如-Wimplicit
、-Wtraditional
和-Wc++-compat
。
https://stackoverflow.com/questions/40911835
复制