[英]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 不允许函数重载。
正如错误所说, gets()
函数已在stdio.h
定义。
你可以做的一个技巧是把这样的东西:
#define gets MY_gets
在您定义gets()
函数之前。
这样你实际上定义了一个MY_gets()
函数,它不会引起冲突。 当您稍后在代码中调用gets()
时,您实际上是在调用MY_gets()
。
如果在头文件中定义gets()
,则应首先包含stdio.h
,然后在头文件中的gets()
声明之前放置#define gets MY_gets
。
虽然我不明白你为什么要改进这个功能,如果它已经存在的话。 仅在需要时定义它并用诸如#ifndef HAVE_GETS
和endif
类的东西来定义它更有意义,其中HAVE_GETS
应该根据在配置/构建系统中完成的测试来定义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.