簡體   English   中英

為什么我可以在gcc -std = c11中使用gets()?

[英]Why can I use gets() in gcc -std=c11?

gets()函數已從C語言中刪除。 標准中不存在此類功能。

然而,我編譯以下代碼:

#include <stdio.h>

int main (void)
{
  (void) gets (NULL);
}

運用

gcc -std=c11 -pedantic-errors -Wall -Wextra

它編譯時沒有給出任何錯誤或警告。 同樣的,

#include <stdio.h>

int gets;

int main (void)
{}

不會編譯(錯誤:'獲得'重新聲明為不同類型的符號)。

在標准4.一致性§6中,我們可以閱讀:

符合實現的實現可能具有擴展(包括附加庫函數),前提是它們不會改變任何嚴格符合程序的行為

鑒於上述情況,我認為即使在迂腐模式下,gcc也不符合標准。 是否有一個原因? 這是故意還是錯誤?

GCC版本4.9.1。

編輯:

gcc --version
gcc (x86_64-win32-seh-rev1, Built by MinGW-W64 project) 4.9.1

gcc只是編譯器,而不是整個實現。

在我的系統(Linux Mint 17.3,gcc 4.8.4,GNU libc 2.19)上,我得到:

$ gcc -std=c11 -pedantic-errors -Wall -Wextra -c c.c
c.c: In function ‘main’:
c.c:5:3: error: implicit declaration of function ‘gets’ [-Wimplicit-function-declaration]
   (void) gets (NULL);
   ^

要正確診斷錯誤, 實現需要符合要求。 這意味着這兩種編譯器(它從來沒有提供gets擺在首位)和圖書館。

您正在使用仍提供gets函數的庫。 因此,整個實現 (由編譯器gcc,庫和其他一些部分組成)不符合C11。

結論:這不是一個gcc問題,gcc可以做的事情並不多。 (好吧,它可以gets發出一個特殊情況診斷,但是它必須確定它不是對具有相同名稱的用戶定義函數的有效調用。)

您的代碼的關鍵行是:

#include <stdio.h>

您是否更新了系統的C庫和標題? 它們與編譯器一起也是C實現的一部分。

更新這可能不是問題的答案,我試圖使其信息化。

我偶然發現提到獲取的gcc沒有以下一些問題庫標准C11 glibc 2.16

請參閱gcc支持C11的狀態: https//gcc.gnu.org/wiki/C11Status 從上面的鏈接歪曲

但我找不到“庫問題”的定義和其他版本的glibc的當前狀態。

所以我試用了我的機器ubuntu16.04和gcc版本5.3.1 20160413 ,glibc版本Ubuntu GLIBC 2.23我們可以在編譯時得到足夠的警告,但是仍然可以執行輸出對象文件的“向后兼容性”。

warning: implicit declaration of function ‘gets’ [-Wimplicit-function-declaration]
warning: the `gets' function is dangerous and should not be used.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM