Miten itse tehtyjä headereita käytetään?
Tutkimalla valmiita ohjelmia tein tällaisen ohjelman:
testi.cpp:
#include "header.h" void main() { funktio(); }
header.h:
void funktio();
header.cpp:
#include <iostream.h> #include "header.h" void funktio() { cout<<"JEE!"; }
Tämä ei kuitenkaan toimi. Virheilmoituksina tulee sekä header.cpp:ssä että testi.cpp:ssä jotakuinkin samat "Unexpected type 'void'" ja "Missing ';' before '}'".
Luin tässä vähän aikaa sitten erään C++-kirjan jossa headereistä ei kerrottu, enkä muista muitakaan kirjoja. Tämä ohjelmani voi siis olla aivan täysin väärin.
Nuo virheet sekä koodit on kirjoitettu ulkomuistista, joten niissäkin saattaa olla virheitä.
Edit: Kuten sanoin, tämä on kirjoitettu ulkomuistista, mutta tällä kertaa tämä koodi on oikein toisin kuin alkuperäinen. Elikkäs header.h:stä puuttui se ';'. Ai että nyt tuntuu n00bilta.
(Minkä takia omia viestejään ei voi poistaa?)
Hassua, koska kyllä niitä juuri noin käytetään, tai ainakin minä käytän.
Tota poisto hommaa saat kysyä anttilta...
Mihin kansioon headerit pitää/kannattaa laittaa?
Joko kansioon "include" tai sitten samaan kansiion .cpp-tiedoston kanssa(kai). Ota kuitenkin huomioon merkintöjen
#include <header.h>
ja
#include "header.h"
erot.
Sekä testi.cpp että header.cpp sisällyttävät koodiin mukaan tuon header.h:n.
Laitat header.h vaikkapa tähän muotoon:
#ifndef _HEADER_H_ //jos muuttujaa _HEADER_H_ ei ole ennestään määritelty #define _HEADER_H_ //... niin määritellään se (esikääntäjälle) void funktio(); #endif //_HEADER_H_
edit: Hieman kommentteja lisää
edit2: Hmm... Dev-C++ tai Mingw sekoilee. Ajattelin, että kääntäjä saattaisi valittaa, koska funktion prototyyppi määriteltäisiin kahdesti, mutta ei siltikään suostu kääntämään joka kerta. Toisella kääntäjällä koodi kääntyi sellaisenaan.
Viestien poistosta: Aiheen 1. viestiä ei voi poistaa.
Headereista: Yleensä projektin omat headerit kannattaa pitää projektin kansiossa. #include "tiedosto"
liittää samassa kansiossa olevia tiedostoja, ja tuosta voi tietenkin laajentaa kansiopolulla (kun muistaa laittaa kaikki kenoviivat): #include "Grafiikka\\Direct3D\\MainRender.h"
<> -merkkien sisällä olevaa tiedostonimeä etsitään kääntäjän include-kansioista. Itselläni on oma include-kansio, jonka olen lisännyt kääntäjän listoihin ja jonne laitan sellaiset omat headerini, joita käytän useammassa projektissa, esimerkiksi 3D-koordinaastistossa liikkuva Piste-luokka (laitan vielä joskus koodivinkkeihin tämän oivan tekeleen).
acorn: _HEADER_H_ ei ole tuossa muuttuja :) Lisäksi sillä ei ole mitään väliä, että molemmat käännösyksiköt sisällyttävät tuon headerin. Include-vahtien tarkoituksena on estää saman headerin sisällyttäminen useasti samaan käännösyksikköön.
Metabolix: mieluummin käytetään kauttaviivoja (/) niin ei tarvitse kenoviivojen eskeippauksesta huolehtia. Toimii mainiosti Windowsillakin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.