C++ preprocessor

#define

Met #define kun je constanten definieren, maar je kunt er veel meer mee. Realiseer je echter dat #define niets anders is dan tekst-substitutie !

Dingen die je aangeeft met #define worden door de preprocessor uitgewerkt voordat de compiler de code krijgt! Het resulteert dus niet altijd in iets dat daadwerkelijk in je programma terechtkomt of geheugenruimte kost. Dat gebeurt pas als je zo'n item gebruikt in je code. Zolang je dat niet doet kost het niks.

Hier is een voorbeeld waarbij text-substitutie iets anders oplevert dan je misschien denkt.

#define SOM 4+5

int main()
{
  int result = 3*SOM;
  cout << result;

  return 0;
} 
Dit kun je oplossen door haakjes te zetten:
#define SOM (4+5)

int main()
{
  int result = 3*SOM;
  cout << result;

  return 0;
} 

#ifdef / #ifndef / #endif

Voorbeeld:

#ifndef _MY_HEADERFILE_H_
#define _MY_HEADERFILE_H_
#endif  // _MY_HEADERFILE_H_
Door dit stukje code op te nemen in een header file kun je ervoor zorgen dat de inhoud van die header maar één keer wordt gebruikt. Vervang MY_HEADERFILE door een naam die overeenkomt met de naam van de betreffende header file. Stel dat we in een header file een class Sample definieren. Die class mag je maar één keer aanmaken. In het volgende voorbeeld zie je hoe dat werkt:

#ifndef _SAMPLE_H_
#define _SAMPLE_H_

  class Sample
  {
  public:
    Sample();
  private:
    long numberofchannels;
  };

#endif  // _SAMPLE_H_

Let op: dit voorkomt alleen dat een header file meerdere malen wordt gebruikt bij het compileren van één C++ source file (.cpp) wanneer die .h via allerlei andere includes meerdere malen 'included' zou worden.

N.B.: De regel dat we in header files geen constructies zetten die geheugen alloceren blijft gelden. Dat is namelijk een link-kwestie. Met het bovenstaande truukje voorkom je niet dat een header door meerdere .cpp-files tijdens hun compilatie gebruikt wordt. Je zult nog steeds moeten opletten dat bij het linken van de objects niet meerdere variabelen met dezelfde naam voorkomen.

#pragma

In plaats van het bovenstaande kun je ook dit gebruiken:


#pragma once
Dit doet hetzelfde, maar is niet standaard ANSI C++.

#if / #elif / #endif

Met #if kun je selectief stukken code uitsluiten van compilatie.

#define DATASET 1

#if DATASET == 0
  float data[POINTS]={1,1,1,1,1,1,1,1,1,1};
#elif DATASET == 1
  float data[POINTS]={5,5,5,5,6,5,5,5,5,5};
#elif DATASET == 2
  float data[POINTS]={1,2,3,4,5,6,7,8,9,10};
#endif