Merke: 'windows.h' hat ungewünschte Nebenwirkungen
Verfasst: Do Okt 01, 2009 10:59 pm
Jetzt habe ich es endlich einmal riskiert meine Spieleengine unter Windows zu kompilieren, mit dem Erfolge das ich einmal sehr, sehr komische Fehlermeldungen erhalte. Der betreffende Codeausschnitt schaut wie folgt aus:
Also wer hier sofort den Fehler findet muss schon sehr gut sein
Irgendwann bin ich dann darauf gekommen, dass der Fehler nur dann auftritt wenn die 'windows.h' eingebunden ist. Ich brauche sie zwar selber nicht, sie wird aber indirekt über die 'SDL_opengl.h' eingebunden. Nagut, dann habe ich einfach das 'include' etwas nach hinten verschoben und es hat funktioniert.
Aber irgendwie hat es mich interessiert was jetzt wirklich schuld daran ist, und deshalb bin ich dem noch etwas genauer nachgegangen bis ich in der 'windef.h' fündig geworden bin. Dort bin ich dann auf zwei sehr sinnvolle Zeilen gestoßen:
Und wer jetzt noch einmal die Parameter der Funktion anschaut, dem dürfte langsam klar werden warum das nicht gehen kann. Und das ganz nur weil Windows nicht die Altlasten ihrer 16 Bit Zeit nicht loswerden kann. Da waren 'near' und 'far' nämlich noch in Verwendung. Wer also in Gefahr läuft irgendwo eine 'windows.h' zu bekommen sollte auf jeden Fall vermeiden in irgendeiner Form 'near' und 'far' in seinem Code zu verwenden 
Code: Alles auswählen
static const Matrix4x4<T> PerspectiveLH( T width,
T height,
T near,
T far )
{
std::cout << "near=" << near << "far=" << far << std::endl;
T dist = near-far;
if( dist > -0.00005 || near < 0.00005
|| width < 0.00005 || height < 0.00005 )
return Identity();
T inv_dist = 1/dist;
return Matrix4x4<T>(
2*near/width, 0, 0, 0,
0, 2*near/height, 0, 0,
0, 0, (near+far)*inv_dist, -1,
0, 0, 2*near*far*inv_dist, 0 );
}

Aber irgendwie hat es mich interessiert was jetzt wirklich schuld daran ist, und deshalb bin ich dem noch etwas genauer nachgegangen bis ich in der 'windef.h' fündig geworden bin. Dort bin ich dann auf zwei sehr sinnvolle Zeilen gestoßen:
Code: Alles auswählen
#define far
#define near
