簡體   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