繁体   English   中英

Mingw -- 由于先前的声明而导致函数类型冲突

[英]Mingw -- Conflicting types for function due to previous declaration

首先,当我在远程连接的 Linux 机器上编译/“制作”代码时,我没有遇到这个问题。 我只在安装了 Mingw 的 Windows 笔记本电脑上遇到它 - 我认为这是导致问题的原因。

$ make
gcc -c parser.c
parser.c:34:7: error: conflicting types for 'gets'
   34 | char* gets(char *buf, int max)
      |       ^~~~
In file included from parser.h:4,
                 from parser.c:1:
c:\mingw\include\stdio.h:709:41: note: previous declaration of 'gets' was here
  709 | _CRTIMP __cdecl __MINGW_NOTHROW  char * gets (char *);
      |                                         ^~~~
Makefile:13: recipe for target 'parser.o' failed
make: *** [parser.o] Error 1

这是所要求的gets() 代码:

char* gets(char *buf, int max)
{
  int i, cc;
  char c;

  for(i=0; i+1 < max; ){
    cc = read(0, &c, 1);
    if(cc < 1) break;
    //c = getchar();
    buf[i++] = c;
    
    if(c == '\n' || c == '\r') 
        break;
  }
  
  buf[i] = '\0';
  return buf;
}

有没有办法在不更改gets函数名称的情况下解决这个问题? 谢谢sm

您的代码可以在 Linux 的 gcc 上运行,因为gets函数已被删除,因为它在 C99 标准中已被弃用并随 C11 被删除。

出于某种原因,在Windows的MingW分布仍保持gets正因为你有一个重新定义的问题。

所以不幸的是你不能使用那个函数名,除非你从stdio.h手动删除它,因为 C 不允许函数重载。

在 Linux gcc 上运行示例

在 Windows gcc 上运行示例

正如错误所说, gets()函数已在stdio.h定义。

你可以做的一个技巧是把这样的东西:

#define gets MY_gets

在您定义gets()函数之前。

这样你实际上定义了一个MY_gets()函数,它不会引起冲突。 当您稍后在代码中调用gets()时,您实际上是在调用MY_gets()

如果在头文件中定义gets() ,则应首先包含stdio.h ,然后在头文件中的gets()声明之前放置#define gets MY_gets

虽然我不明白你为什么要改进这个功能,如果它已经存在的话。 仅在需要时定义它并用诸如#ifndef HAVE_GETSendif类的东西来定义它更有意义,其中HAVE_GETS应该根据在配置/构建系统中完成的测试来定义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM