I have a very simple c source like this:
#include <iostream>
int main() {
srand(time(NULL));
}
I am using g to compile like this :
g ./test.cpp
but it successfully compiles despite the fact that time()
function is defined in ctime
and it is not included with #include
my professor at university runs the code with visual studio (vc ) but he is unable to run the code without including ctime
Am I missing something here ?
by the way my g version is :
g (Ubuntu 11.2.0-7ubuntu2) 11.2.0
CodePudding user response:
First of all, on my platform, it didn't compile successfully when I removed #include <iostream>
I am using WSL2 ubuntu 20.04, compiler i used g and clang .
Whichever compiler it is, it gives the error:
>>> g t.cpp
t.cpp: In function ‘int main()’:
t.cpp:2:16: error: ‘NULL’ was not declared in this scope
2 | srand(time(NULL));
| ^~~~
t.cpp:1:1: note: ‘NULL’ is defined in header ‘<cstddef>’; did you forget to ‘#include <cstddef>’?
| #include <cstddef>
1 | int main() {
t.cpp:2:11: error: ‘time’ was not declared in this scope
2 | srand(time(NULL));
| ^~~~
t.cpp:2:5: error: ‘srand’ was not declared in this scope
2 | srand(time(NULL));
| ^~~~~
>>>clang t.cpp
t.cpp:2:16: error: use of undeclared identifier 'NULL'
srand(time(NULL));
^
1 error generated.
I think you can use the compile option -E to prompt the compiler to do only preprocessing and to see the preprocessed file.
like this:
g t.cpp -E -o pre_proccessed.cpp
Determine whether the compiler did what you suspect it did during the compilation process, "automatically include the file"
But, when I add #include <iostream>
It did success.
So, I did this:
>>>g t.cpp -E -o t_.cpp
>>>cat t_.cpp | grep srand
extern void srandom (unsigned int __seed) throw ();
extern int srandom_r (unsigned int __seed, struct random_data *__buf)
extern void srand (unsigned int __seed) throw ();
extern void srand48 (long int __seedval) throw ();
extern int srand48_r (long int __seedval, struct drand48_data *__buffer)
using ::srand;
This explains why its compilation succeeded, because the iostream file included in this platform has the definition of this function in it.
In addition, look at this problam
In fact, stl are allowed to include each other.
But even though it is defined in this header file, you cannot rely on it, some versions of the iostream implementation do not include this.
CodePudding user response:
Give the enough header file for your program is necessary.
CodePudding user response:
first of all explicitly include what you need,
(thanks to darkblueflow for pointing it out)
secondly
#include
order matters,
believe or not they can shadow declaration, just switch if first case doesn't work
#include <cstdlib>
#include <ctime>
// differs from
#include <ctime>
#include <cstdlib>
// in some aspects
your best shot is to include headers explicitly and keep this in mind this good luck