【发布时间】:2020-10-11 14:35:39
【问题描述】:
首先,当我在远程连接的 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
【问题讨论】:
-
@anastaciu 我不是。我认为代码中没有问题,因为我在 Linux 机器上运行它没有问题。
-
gets函数已正式从 C 标准中删除(但一些编译器仍将其包含在标准库的实现中) .在 C++ 中,它在 C++11 标准和 removed in C++14 中被弃用。您是否可能在两个平台上使用不同的标准? (也就是说,请确保您使用的是 C++14 或更高版本。) -
另外,您能否澄清一下您使用的是 C++ 还是 C。
gcc -c parser.c行在我看来就像您在 C 源代码上调用 C 编译器。也许你想要g++ -c parser.cpp -std=c++14?? -
@alee,这不太可能是问题,因为在 gcc 中
gets在没有std命名空间的情况下可用,但这可能是一些疯狂的冲突,无论如何,这很奇怪你的 get 有 2 个参数,它不应该与库gets冲突,尽管它已从 C 和 C++ 标准中删除,但由于某种原因尚未从 gcc 中删除。 -
自从我使用 MingW 或任何 GNU 主线东西以来已经有很长时间了,但是
gcc是 IIRC,仅用于 C 并且正如 @anastaciu 所说(和我暗示过),对于 C++,您需要g++。