Let's imagine I have a header file like so:
// foo.h
struct Foo
{
};
And then I accidentally include it twice:
#include "foo.h"
#include "foo.h"
This would end up attempting to compile the following, which would generate an error... 
struct Foo
{
};
struct Foo //< error 'Foo' declared twice
{
};
One way to fix this is to get the pre-processor to remove the second occurance, and to do this we define a unique identifer per header file. e.g. 
#ifndef FOO_H_
#define FOO_H_
struct Foo
{
};
#endif
And now if we accidentally include it twice... 
#ifndef FOO_H_    //< not yet declared
#define FOO_H_    //< so declare it
struct Foo
{
};
#endif
#ifndef FOO_H_   //< this time FOO_H is defined... 
#define FOO_H_   //< ... so DO NOT include this code. 
struct Foo
{
};
#endif
Personally though I'd recommend achieving this same thing via the slighty non-standard (although supported by most, if not all, compilers). 
#pragma once   //< only ever include this file once
struct Foo 
{
};