在C99中,函数“gets”的隐式声明无效。

4

我为什么会遇到这个错误?

implicit declaration of function 'gets' is invalid in C99 [-Werror,-Wimplicit-function-declaration]

代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct myStruct
{
    char name[20];
    char tel[20];
}contact;

int main(void)
{
    contact *mycont[3];

    for(int i=0; i<3; i++)
    {
        mycont[i] = (contact*)malloc(sizeof(contact));
        printf("Enter Name Of The Contact No.%d\n",i+1);
        gets(mycont[i]->name);
        printf("Enter The Contact Telephone Number\n");
        gets(mycont[i]->tel);
    }
}

7
“gets”函数是C99标准的合法部分。在C99中,它已经变得过时(被弃用),并且在C11中已被移除。 - Grzegorz Szpetkowski
7
“隐式声明函数'gets'无效”的消息表明在stdio.h中没有函数原型(隐式声明假定为'int'参数)。 - Weather Vane
3
也许这段代码是使用禁用过时函数声明的标志编译的。 - John Bollinger
4
函数gets()已被弃用。不建议使用它,因为它被认为是不安全的。在您的程序中,您只需传递接收器数组的名称,而无法知道输入的长度。如果您的用户记住不要写超过20个字符的名称,那么可以使用它。但是,如果用户超过了该限制,gets()也会超出数组边界继续写入其不拥有的内存。 - user3078414
2
请查看为什么gets()如此危险,不应该使用。这并没有解释为什么在包含<stdio.h>的情况下它没有被声明。特别是在C99规则下,它应该被声明——自1999年起,它是C99标准的一部分,并且直到后来才被弃用,在C11中才从标准中删除。要理解发生了什么,我们可能需要更多关于您正在使用的平台(操作系统、版本、C编译器、版本、用于编译的命令行)的信息。 - Jonathan Leffler
显示剩余7条评论
1个回答

3

可以肯定的是,即使错误信息中提到了C99,你实际上使用的编译器遵循的是更晚的标准,在这个标准中,gets函数已经被移除而不仅仅是被弃用。

例如,当我尝试编译以下简单程序时:

#include <stdio.h>
char buff[1000];
int main(void) {
    gets(buff);
    return 0;
}

在Ubuntu 18.04下,使用clang
clang -Werror --std=c11 -o qq qq.c

我明白您所说的错误信息:

我得到了相同的错误:


qq.c:4:2: error: implicit declaration of function 'gets' is invalid in C99
                 [-Werror,-Wimplicit-function-declaration]

这实际上只与gets的弃用和删除有点关系(因为它不再在任何地方声明)。更重要的是,你不应该尝试使用没有有效声明的任何函数,如ISO C99 Foreword /5所述(意思是):

这个第二版取消并替代了C90,由各种其他ISO无聊东西修正。与上一版相比,主要变化包括:

  • 移除隐式函数声明。

  • 还有很多其他与此问题无关的内容。

如果你将gets替换为xyzzy,就会得到相同的错误:

qq.c:4:2: error: implicit declaration of function 'xyzzy' is invalid in C99
                 [-Werror,-Wimplicit-function-declaration]

事实上,如果您尝试使用已设置C99标志的gets函数,您将收到完全不同的消息(如果您的编译器在取消gets函数之前就已经实现了C99,则可能根本不会收到消息):

qq.c:4:2: error: 'gets' is deprecated
                 [-Werror,-Wdeprecated-declarations]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接