The short of it is this. You can't include a global in a header file and then have that header includes elsewhere. You'll get the nasty "re-definition" error. Unless....
This is what I do.
Header file happy.h
extern int happy; // Global variable
Main file
#include "happy.h"
int happy = 12;
Other file.c
#include "happy.h"
int happy = 10;
On question 2: That depends on the compiler. Some will implicitly add it, however, good coding would be one where you include any .h files that you are intending to use a function from.
Note* It is never a good idea to place globals in a header. The intended use of a header is struct definitions and "public" function declarations. Struct / Union etc definitions are only included in headers when it becomes necessary. Example:
typedef struct
{
int happy;
char sad;
} my_mood_t;
my_mood_t *what_is_my_mood( int dog_ate_my_lunch );