Koodasin aivan normaalisti, kun tuli tälläiset warningit:
32:1 C:\Ohjelmat\Dev-Cpp\include\SDL\SDL_opengl.h [Warning] "NOMINMAX" redefined
64 C:\Ohjelmat\Dev-Cpp\include\c++\3.4.2\mingw32\bits\c++config.h:
46:1 C:\Ohjelmat\Dev-Cpp\include\c++\3.4.2\mingw32\bits\os_defines.h [Warning] this is the location of the previous definition
Mistäköhän tuo johtuu? Valittaa jostain NOMINMAX:ista. Pyörii normaalisti, mutta warningit ärsyttävät :/
Edit: Jätin includoimatta tuossa camera.h:ssa tuon SDL_opengl.h:n ja toimi. Outoa O_o
Tuollahan se sanotaan varsin selvästi, eli "NOMINMAX" on määritelty monta kertaa. Näin käy helposti jos sisällytät esim. jonkin SDL:n tai OpenGL:n vaatiman otsikkotiedoston useaan tiedostoon, joista rakennat projektisi.
Ok. Kummallinen oli silti, en tuollaista ennen ole kohdannut...
Nyrkkisääntönä tällaisissa tapauksissa voidaan pitää, että koskaan ei pitäisi lisätä järjestelmäheadereita kuten OpenGL tai Windows mihinkään muuhun headeriin, vaan sisällyttää ne suoraan niihin C++ fileihin missä niitä tarvitaan.
Kannattaa myös opetella forward declaration-käsite jos ei ennestään tuttu, useimmista tuollaisista varoituksista mitä sinulla on pääse eroon käyttämällä forward declarationia, sekä bonuksena usein myös projektin käännösaika lyhenee :)
http://en.wikipedia.org/wiki/Forward_declaration
http://www-subatech.in2p3.fr/~photons/subatech/soft/carnac/
http://www.adp-gmbh.ch/cpp/forward_decl.html
pieslice kirjoitti:
Nyrkkisääntönä tällaisissa tapauksissa voidaan pitää, että koskaan ei pitäisi lisätä järjestelmäheadereita kuten OpenGL tai Windows mihinkään muuhun headeriin, vaan sisällyttää ne suoraan niihin C++ fileihin missä niitä tarvitaan.
Ei. Include-tiedostoihin kannattaa juurikin panna #includet kaikille niille header-tiedostoille, joita include-tiedosto itse tarvitsee toimiakseen. Muutoin varsinaisten sorsatiedostojen ylläpito menee ihan pelleilyksi ja (työ-) kaverit antavat hivutusta.
Lisäksi omiin include-tiedostoihin pitää laittaa include-vahdit:
#ifndef MUN_LUOKKA_HPP_INCLUDED #define MUN_LUOKKA_HPP_INCLUDED #include <string> // esimerkiksi class luokka { std::string text; // jne. }; #endif
Minulla ei nyt ole näköpiirissäni SDL-roinaa, mutta arvaan että SDL_opengl.h hoitaa jonkun osan tästä ns. venäjäksi.
Forward declaration ei oikein pelaa, jos pelissä on muutakin kuin pointtereita tai referenssejä. Template-tapauksissa esittelyjen käyttö voi sekin olla aika työlästä.
Jos joku vastanneista olisi vaivautunut lukemaan vähän tarkemmin, olisi jo selvillä, että makro NOMINMAX on määritelty ensin GCC:n omissa otsikoissa (mingw32\bits\os_defines.h) ja myöhemmin SDL:n otsikossa (SDL_opengl.h). Täten lienee luultavaa, että näillä määrittelyillä ei ole mitään tekemistä keskenään, vaan huonoksi onneksi tiedostoihin on sattunut samanniminen makro.
Pikainen tutkimus osoitti, että molemmissa tapauksissa makron tarkoituksena on estää Windowsin otsikkotiedostoja määrittelemästä min- ja max-makroja. Molemmissa paikoissa oli ainakin tässä MinGW-asennuksessa myös varmistettu, ettei tuollaisia virheitä pitäisi tulla (toisessa oli ensin #undef, toisessa taas #ifndef-tarkistus). Tarkista vielä asennustesi ajantasaisuus.
Aihe on jo aika vanha, joten et voi enää vastata siihen.