The gets()
function has been removed from the C language. No such function exists in the standard.
Yet I compile the following code:
#include <stdio.h>
int main (void)
{
(void) gets (NULL);
}
using
gcc -std=c11 -pedantic-errors -Wall -Wextra
and it compiles without giving any errors or warnings. Similarly,
#include <stdio.h>
int gets;
int main (void)
{}
will not compile (error: 'gets' redeclared as different kind of symbol).
In the standard 4. Conformance §6 we can read:
A conforming implementation may have extensions (including additional library functions), provided they do not alter the behavior of any strictly conforming program
Given the above I don't think gcc is standard-compliant, even in pedantic mode. Is there a reason for this? Is this intentional or is it a bug?
GCC version 4.9.1.
Edit:
gcc --version
gcc (x86_64-win32-seh-rev1, Built by MinGW-W64 project) 4.9.1
gcc is just the compiler, not the entire implementation.
On my system (Linux Mint 17.3, gcc 4.8.4, GNU libc 2.19), I get:
$ 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);
^
To correctly diagnose the error, the implementation needs to be conforming. That means both the compiler (which never provided gets
in the first place) and the library.
You're using a library that still provides the gets
function. Because of that the implementation as a whole (which consists of the compiler gcc, the library, and a few other pieces) does not conform to C11.
Bottom line: This is not a gcc issue, and there's not much that gcc can do about it. (Well, it could issue a special-case diagnostic for gets
, but then it would have to determine that it's not a valid call to a user-defined function with the same name.)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With