The C Preprocessor is not a part of the compiler, but is a separate step in the compilation process. In simple terms, a C Preprocessor is just a text substitution tool and it instructs the compiler to do required pre-processing before the actual compilation. All preprocessor commands begin with a hash symbol (#).

Preprocessor examples:
Consider the following directives:

#define ARRAY_LEN 42;

This directive tells the C preprocessor to replace instances of ARRAY_LEN with 42.

#include <stdlib.h> 

The C preprocessor processes directives of the form #include <file> in a source file (.c file) by locating the associated file on disk and including its contents into a copy of the source file, replacing the include directive in the process.

#ifndef HEADER_H
    #define HEADER_H
#endif

It tells the C preprocessor to define HEADER_H only if HEADER_H is not already defined. It is called include guards.


Source: Wikipedia

References:
C Documentation about preprocessor and directives