Grandi wrote:Älä liitä .cpp vaan .h tai .hpp tiedostoja. Sellaisen sisältö voisi olla vaikka tälläinen:
Jotkut luovat vielä .cpp tiedoston erikseen toteutuksille, mutta minun mielestäni se on täysin turhaa eikä selkeytä mitään. Tuohon samaan filuun voi ihan hyvin sysätä kaiken.
Krhm... Sen tarkoituksena ei välttämättä olekaan niinkään selkiyttää vaan se on useissa tapauksissa muutenkin järkevää.
Oletetaan, että koodisi koostuu kahdesta moduulista ja ne molemmat sisällyttävät saman header-tiedoston, jonne joku älypää on mennyt tunkemaan koodiakin. Tällöin molemmat moduulit tulevat sisältämään samat funktiot ja niistä linkitetty exe tulee sisältämään saman funktion kahdesti.
Itseasiassa vastaavasta ongelmasta oli juuri kysymys: Oletan että Jani käytti IDEä, jossa nuo molemmat tiedostot olivat osa projektia. Kääntäjä käänsi ensiksi ohjelma.cpp:n, joka sisälsi includen takia Teksti()-funktion. Sen jälkeen kääntäjä käänsi vielä funktio.cpp:n joka sisältää myös Teksti()-funktion. Nyt kääntäjä ei osaa enää jatkaa, koska sillä on kaksi Teksti()-funktiota. Jos yllä olevassa tapauksessa haluaa välttää header tiedoston käyttöä, voisi menetällä seuraavasti:
Code: Select all
// Ohjelma.cpp
//iostreamia ei tarvitse sisällyttää tähän, sillä mainin ei tarvitse tietää kuin Teksti funktion olemassa olosta
void Teksti(); //Tämä olisi normaalisti header tiedostossa, mutta voi sen sijoittaa tähänkin.
//Tämä siis kertoo että on olemassa Teksti()-funktio.
int main(void) {
Teksti();
}
Code: Select all
//funktio.cpp
#include <iostream> //Teksti()-funktio tarvitsee iostreamin funktioita
/* Tähänkin voi halutessaan liittää tuon rivin:
void Teksti();
joka kertoisi että se on olemassa myös tälle funktiolle */
void Teksti() { //en tiedä miksi tyyppinä oli char, koska funktio ei kerran palauta mitään?
std::cout << "Funktio";
}
Header-tiedostojen tarkoitus on kertoa, että jotakin on olemassa jossakin, niiden ei tule itse sisältää varsinaisia toteutuksia (paitsi inline-funktiot).