In this post, we are going to discuss some confusions that you might have got in the previous post. You might have read #include "func.h"
in that post and not #include <func.h>
. Actually, both have different meanings!
If we type angle brackets (<>) instead of double quotes (“”) for func.h
, the compiler will check for that file in the C++ base-files directory and project specified include directory. From C++ base files, I mean those files which also includes the most commonly used iostream
, math.h
, string
, etc, that are the files of standard C++. All these C++ standard files are header files although they may not have .h
at the end of their names.
If we type double quotes as in the previous post, the compiler will check for that file in the local project directory. This directory is the same directory where the IDE adds all our files to.
In a nutshell,
- #include <file_name> – searches the file in base and project specified include directory.
- #include “file_name” – searches the file in the local project directory.
Now, we know what double quotes and angle brackets do with #include
. But we actually, don’t know what #include
do! #include
simply, copy the codes from the file and then, paste it into that file where it is called.
This is something that we don’t need to know. What we need to know is the fact that C++ doesn’t allow more than one definitions. You can’t just do that:
void func()
{
//code here...
}
//Another time: gives error!
void func()
{
//code here...
}
It might be possible that we include things twice or, the other and most common cause is that the file that we are including, includes another file that is already included in our file! To make it clear, see the code below:
#include "a" //'a' file contains function 'func()'
#include "b" //'b' file includes file 'a'
//'func()' is defined twice
//So gives error!
That hash(#) before the include suggests that the command after it is a preprocessor directive and not a C++ code. These directives run before the compilation of the actual program. There are many of these. You can check out preprocessor directives in details here.
In order to make sure that something is defined just once, you can use preprocessor directives like that:
#ifndef SOMETHING //This means 'if not defined preprocessor term called SOMETHING'
#define
//code here
#endif //This ends the '#ifndef' statement
The above code just acts similar to the C++ if-statement that we discussed before.
SOMETHING
can be anything. It can be an integer, a group of characters, a float, etc.
#define PI 3.14 //Now, PI is equal to 3.14
int main()
{
cout << PI << endl; //We can use it as a regular double
PI++; //Gives error; preprocessor definations are constants!
return 0;
}
I hope that you got all of the above things. Just practice using headers and prototypes. Find errors and then, try to fix them yourself.