Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Kumma varoitus (SDL ja OpenGL)

Kray [10.03.2008 16:16:55]

#

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:35, from C:\Ohjelmat\Dev-Cpp\include\c++\3.4.2\bits\stl_algobase.h In file included from C:/Ohjelmat/Dev-Cpp/include/c++/3.4.2/mingw32/bits/c++config.h:35, from C:/Ohjelmat/Dev-Cpp/include/c++/3.4.2/bits/stl_algobase.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

Tumpelo [10.03.2008 16:42:12]

#

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.

Kray [10.03.2008 16:48:29]

#

Ok. Kummallinen oli silti, en tuollaista ennen ole kohdannut...

pieslice [10.03.2008 20:25:31]

#

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/CPP-INC-1.shtml
http://www.adp-gmbh.ch/cpp/forward_decl.html

koo [10.03.2008 23:19:02]

#

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ä.

Metabolix [11.03.2008 11:35:35]

#

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.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta