Hopefully this is a very simple question. Following is the C pgm (test.c) I have.
#include <stdio.h>
//#include <stdlib.h>
int main (int argc, char *argv[]) {
int intValue = atoi("1");
double doubleValue = atof("2");
fprintf(stdout,"The intValue is %d and the doubleValue is %g\n", intValue, doubleValue);
return 0;
}
Note that I am using atoi() and atof() from stdlib.h, but I do not include that header file. I compile the pgm (gcc test.c) and get no compiler error!
I run the pgm (./a.out) and here is the output, which is wrong.
The intValue is 1 and the doubleValue is 0
Now I include stdlib.h (by removing the comments before the #include) and recompile it and run it again. This time I get the right output:
The intValue is 1 and the doubleValue is 2
How come the compiler did not complain about not including the stdlib.h and still let me use the atoi(), atof() functions?
My gcc info:
$ gcc --version
gcc (GCC) 4.1.2 20070925 (Red Hat 4.1.2-27)
Any thoughts appreciated!
For historical reasons -- specifically, compatibility with very old C programs (pre-C89) -- using a function without having declared it first only provokes a warning from GCC, not an error. But the return type of such a function is assumed to be int
, not double
, which is why the program executes incorrectly.
If you use -Wall
on the command line, you get a diagnostic:
$ gcc -Wall test.c
test.c: In function ‘main’:
test.c:5: warning: implicit declaration of function ‘atoi’
test.c:6: warning: implicit declaration of function ‘atof’
You should use -Wall
basically always. Other very useful warning options for new code are -Wextra
, -Wstrict-prototypes
, -Wmissing-prototypes
, -pedantic
, and -Wwrite-strings
, but compared to -Wall
they have much higher false positive rates.
Tangentially: never use atoi
nor atof
, they hide input errors. Use strtol
and strtod
instead.
If you don't specify otherwise, I believe a C compiler will just guess that undeclared functions take the form extern int foo()
. Which is why atoi
works and atof
doesn't. Which compiler flags were you using? I suggest using -Wall
to turn on a bunch of gcc warnings, which should include referencing undeclared functions.
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