Eli mulla on tuo Visual C++ 2008 Express Edition cpp-editorina. Tarvisin vähän apua kun en tiedä mikä on yleinen tapa hallita projekteja jos haluaa käyttää useampaa tiedostoa. Eli mitä kannattaa laittaa mihinkin tiedostoon ja pitääkö niitä includettaa jne.
Esimerkkinä, mulla on pienehkö merkkipeliprojekti jossa on kolme tiedostoa, main, classit ja funktiot. Kaikki on .cpp. Idea on että mainissa on pääfunktio eikä muuta ja muissa on mitä niiden nimet nyt sanookin. Ongelmaksi muodostui se että funktiotiedosto vaatii että classitiedosto on sisällytetty, ja main tiedosto vaatii että molemmat kaksi muuta on sisällytetty. Sitten kun sisällytin tarvittavat tiedostot niin menee ihan sekaisin koko homma, alkaa valittaa LNK2005 erroria, että joku funktio ja classi on jo kertaalleen määritelty, koska ilmeisesti se sisällyttää niitä tiedostoja kahteen kertaan jne... Miten näitä nyt kannattaisi hallita?
https://www.ohjelmointiputka.net/koodivinkit/
Tärkeintä on ymmärtää #includen merkitys. Myös esittelyn ja määrittelyn eron ymmärtäminen on olennaista. Kannattanee lukea ensin tuota vehkiksen linkittämää opasta edeltävä osa. Eli https://www.ohjelmointiputka.net/koodivinkit/
Visual C++ 2008 esikääntäjä ja useat muut hoitavat tuon kahteen kertaan includoinnin eston komennolla:
#pragma once
Kannattaa kuitenkin suosia tuota Metabolixin vinkeissä esittämää tapaa, koska se on standardin mukaista ja toimii käytännössä kaikilla esikääntäjillä. Tosin pragmallakin on hyvät puolensa. Ensinnäkin se on helpompi kirjoittaa koodiin, jolloin typoista aiheutuvat virheet eliminoituvat ja toisekseen se usein nopeuttaa käännöstä ja kolmanneksi sillä vältetään potentiaaliset nimitörmäykset. Esimerkiksi tilanne:
#ifndef __HEADER_H
#define __HEADER_H
/* header here */
#endif
Mitä jos projektiin otetaan tiedostoja muualta, jotka ovat jo määrittäneet tuon __HEADER_H:n? Silloin tuota tiedostoa ei tule includoitua kertaakaan. #pragma once tapauksessa ongelmaa ei ole. Mutta kuten sanottua, se ei ole standardin mukaista, eikä välttämättä toimi muilla.
Aihe on jo aika vanha, joten et voi enää vastata siihen.