#if vs #ifndef vs #ifdef

Meu problema é antes de tudo, entender#ifndef e#ifdef. Eu também quero entender a diferença entre#if, #ifndef e#ifdef. Eu entendi aquilo#if é basicamente uma declaração if. Por exemplo:

#include<iostream>
#define LINUX_GRAPHICS 011x101

int main(){
 long Compare = LINUX_GRAPHICS;
 #if Compare == LINUX_GRAPHICS
   std::cout << "True" << std::endl;
 #endif
}

Mas os outros, embora eu tenha lido sobre eles, não consigo compreender. Eles também parecem termos muito semelhantes, mas duvido que funcionem da mesma forma. A ajuda seria muito apreciada.

questionAnswers(5)

yourAnswerToTheQuestion