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

gets()函数已从C语言中删除。 标准中不存在此类function。

然而,我编译以下代码:

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

运用

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

它编译时不会出现任何错误或警告。 同样的,

 #include  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 cc cc: In function 'main': cc:5:3: error: implicit declaration of function 'gets' [-Wimplicit-function-declaration] (void) gets (NULL); ^ 

要正确诊断错误, 实现需要符合要求。 这意味着编译器(从未提供过首选)和库。

您正在使用仍提供gets函数的库。 因此,整个实现 (由编译器gcc,库和其他一些部分组成)不符合C11。

底线:这不是一个gcc问题,gcc可以做的事情并不多。 (好吧,它可以gets发出一个特殊情况诊断,但是它必须确定它不是对具有相同名称的用户定义函数的有效调用。)

您的代码的关键是:

 #include  

您是否更新了系统的C库和标题? 它们与编译器一起也是C实现的一部分。

更新这可能不是问题的答案,我试图使其信息化。

我碰巧发现gcc提到的不符合某些库问题glibc 2.16 C11标准。

请参阅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.