不带原型的函数声明在所有C版本中都不受支持,并且在C2x中不受支持

bfhwhh0e  于 2023-10-16  发布在  其他
关注(0)|答案(2)|浏览(160)

我在C程序中实现了链表,但在终端中给出了以下警告

linkedstr.c:36:11: warning: a function declaration without a prototype is deprecated in all versions of C and is not supported in C2x [-Wdeprecated-non-prototype]
    link *search_link() , *pred_link();
          ^
linkedstr.c:36:28: warning: a function declaration without a prototype is deprecated in all versions of C and is not supported in C2x [-Wdeprecated-non-prototype]
    link *search_link() , *pred_link();

下面是以下函数的代码

link *search_link(link *l, int x)
{
    if (l == NULL)
        return NULL; //end of list is reached
    if (l->val == x)
        return l;
    else
        return (search_link(l->next, x)); //search sub_list
}

link *pred_link(link *l, int x)
{
    if (l == NULL || l->next == NULL)
        return (NULL);
    if ((l->next)->val == x)
        return (l);
    else
        return (pred_link(l->next, x));
}

我谷歌了一下,有一个解释link ],但它说,我们不能离开参数为空,我们必须传递foo(void),而不是foo(),但我清楚地给了参数在我的函数,为什么警告?

a9wyjsp7

a9wyjsp71#

这个链接谈到了“没有原型的函数声明”,这是这些

link *search_link() , *pred_link();

以前,你可以让()为空,编译器必须猜测函数使用的参数。
这已经“坏”了很长一段时间了,很快就会在C23中被禁止(就像编译器说的那样)。所以只要在那里添加参数类型,使它们成为原型。

xtfmy6hx

xtfmy6hx2#

要理解编译器消息,你需要知道 prototype 的定义。C 2018 6.2.1 2说:

  • .(function prototype 是一个函数的声明,它声明了它的参数的类型。

因此,当编译器消息说“没有原型的函数声明”时,它指的是这些声明:
link *search_link() , *pred_link();
link *search_link()声明了一个函数,但没有声明其参数的类型。所以它是一个没有原型的函数声明。
要解决这个问题,请将参数类型添加到声明中:
link *search_link(link *, int), pred_link(link *, int);

相关问题