[英]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.