如何在C代码库中找到参数类型列表的用法?

如何在C代码库中找到参数类型列表的用法?,c,parameters,function-declaration,C,Parameters,Function Declaration,我最近了解到,C中有一些可以为空: int print(); int main() { print("hallo"); // << valid but highly unintuitive } int print() { } 我没有找到一个编译器标志来警告空参数类型列表,只警告隐式函数声明 我能做些什么来帮助我在给定的代码库中找到参数类型列表的所有用法吗 例如 并解决类型问题(如果声明未列出参数,则C++不允许参数) 让编译器列出所有函数声明(不知道是否可能

我最近了解到,C中有一些可以为空:

int print();

int main() {
    print("hallo");    //   << valid but highly unintuitive
}

int print() {
}
我没有找到一个编译器标志来警告空参数类型列表,只警告隐式函数声明

我能做些什么来帮助我在给定的代码库中找到参数类型列表的所有用法吗

例如

  • 并解决类型问题(如果声明未列出参数,则C++不允许参数)
  • 让编译器列出所有函数声明(不知道是否可能),并手动搜索空大括号
  • grep
    ing参数类型列表(对我来说太复杂:)
  • 通过编译器开关禁用参数类型列表(未找到任何)

您需要查找的是
()
(带可选空格),然后是
{
(带可选空格,可能是换行符)。您可以将其替换为
(void)

如果您想要一个“工业级”的解决方案,您可以使用一个编译器,它可以发出一些更容易解析的东西,例如or。

对于gcc,使用-Wstrict原型将实现您所期望的:

-Wstrict原型(仅限C和Objective-C) 如果在未指定参数类型的情况下声明或定义函数,则发出警告。(如果前面有指定参数类型的声明,则允许在不发出警告的情况下使用旧式函数定义。)

以您的示例为例,它给出了:

hallo.c:1:5: warning: function declaration isn’t a prototype [-Wstrict-prototypes]
 int print() {
     ^
但是,您必须确保正确定义现有代码中的所有非严格函数声明;特别是,没有参数的函数应使用(void)声明,如下所示:

 int print(void);
<>您的示例无效,在C中也不在C++中。因为您的<代码>打印())/代码>函数不接受任何参数(它从您提供的函数定义(C2011,7.7.63/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原型
-Wold风格定义
,这两个选项GoCube将同时显示既不是原型也不是K& R样式函数定义的函数声明。GCC还有一些其他可能对您有兴趣的选项,如<代码> Wimplicit < /COD>,<>代码> WORMADS,和> WC++COMPATA。< /P>不能用C++编译器编译C代码!C++是不同的语言,我是语义语法并不意味着语义相同,C++不是“C类”。!和参数类型列表正是正确的C所必须使用的。其他所有内容都已经过时,并且在17年前就已经弃用了。不清楚您想要实现什么。也许我理解错了,所以如果我这样做,请纠正我,但我想您希望摆脱像
int-fun(a,b)int-a;float b;{
。对吗?那么你不想摆脱参数类型列表,你想摆脱旧式的K&R标识符列表。如果你需要做的只是识别函数定义,其中有一个空的参数列表
()
,你想用
(void)替换它
,则通常可以根据代码中此类函数的正常布局创建启发式扫描来完成此项工作。如果代码库是无政府的(也称为正常),则括号之间会有带空格的变体。如果使用1TB,则
()
{
.Etc.如果您想找到对不带参数的函数的错误调用,请确保作用域中始终有一个原型(表示
(void)
)和编译。@frans,您添加到问题中的make调用示例显示编译器没有使用您在
make
命令行上指定的警告选项,正如我所期望的那样。您需要修改makefile以使其使用这些选项,或者可能将
make
的选项指定为宏t的值makefile使用的方法,例如
CFLAGS
。如果有一个例子,这肯定是一个答案。这是我在问题中列出的第二个和第三个方法。但是,由于到处都可能有空格和换行符,这就导致了我的regex/escape地狱。好吧,你的答案听起来很深刻,所以可能我不明白重点。我的问题是m表示编译器不接受
void print(){..}
并使用参数调用它。也许我的措辞是错误的。@frans,如果您的编译器接受带有参数的函数调用,即使函数定义没有指定任何参数,那么要么调用点的作用域中没有该函数的原型,要么编译器有缺陷。如果您使用的是GCC,那么它将如果您使用
-Wimplicit
(或
-Wall
),我将警告您对未声明函数的调用。在这种情况下,如果您还使用
-Wstrict prototype
,则GCC将标记函数声明
int my_func(int a, char *b);
//          ^^^^^^^^^^^^^^----- parameter-type-list