Warum man die Bezeichnungen near und far nicht verwenden sollte, wenn man die windows.h benutzt

Verwendet man die Header windef.h oder windows.h in seinen Programmen, dann kann man die Bezeichner near bzw. NEAR und far bzw. FAR nicht verwenden. Grund dafür sind zwei Defines „near“ und „far“, die in der windef.h enthalten sind. Heute werden diese zwar nicht mehr verwendet, sind aber aus Kompatibilität zu Programmen aus der Zeit des 16-Bit Windows, als es noch near- und far-Zeiger gegeben hat, noch immer vorhanden.

Fehlermeldung

Wenn man nun irgendwo in seinem Programm eine Variante der erwähnten Bezeichner verwendet kann es zu Fehlermeldungen ähnlich dieser kommen:

<file>:<line>: error: expected primary-expression before '...' token

Jetzt schaut man sich dann seinen Code an und findet aber offensichtlich keinen Fehler. Dann sollten wir uns einfach einmal alle 'near' und 'far' wegdenken und den Code noch einmal anschauen.

Beispiel

Schauen wir uns jetzt noch ein paar Beispiel an, die teilweise nicht einmal einen Compilerfehler hervorrufen, sondern einfach nur anders als erwartet funktionieren:

#include <windows.h>
 
// Folgende Funktion lässt sich kompilieren, gibt aber grundsätzlich den Wert -1 zurück.
int do_something (int near)
{
  //Tut etwas
  return near - 1;
}
 
// der Compiler sieht nur noch " * = 0;" und gibt eine Fehlermeldung
void  do_more (char *far)
{
  //Tut noch mehr
 
  *far = 0;
}

Der obige Code wird nicht kompilierbar sein, da die Bezeichner „near“ und „far“ durch die Defines, welche in der windef.h enthalten sind entfernt werden:

#define far
#define near

Achtung - Fehler auf Umwegen

windef.h wird auch über die häufig verwendete windows.h eingebunden. Allerdings kann man auch Opfer werden, wenn man keine der beiden Dateien selbst einbindet. Wenn man zum Beispiel die SDL unter Windows verwendet und dabei SDL_opengl.h einbindet wird die windows.h und damit in weiterer Folge wieder auch die windef.h eingebunden. Es ist also ratsam, entweder sehr genau zu überprüfen, ob die windef.h eingebunden wird oder am Besten gleich auf die Verwendung von 'near' und 'far' zu verzichten.