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