Vakiot
Sellaiset
...
tiedot,
...
joita
...
ei
...
haluta
...
muuttaa
...
ohjelman
...
suorituksen
...
aikana,
...
kannattaa
...
määritellä
...
vakioiksi.
...
Esimerkiksi
...
pii
...
on
...
koko
...
ohjelman
...
ajan
...
sama.
...
C:ssä
...
käytetään
...
#define
...
-makroa
...
vakioiden
...
määrittelyyn:
Code Block |
---|
\#define PII 3.14 Edellämainitulla |
Edellä mainitulla tiedolla
...
ei
...
kuitenkaan
...
ole
...
tyyppiä
...
ja
...
siksi
...
C++:ssa
...
tulisi
...
käyttää
...
määrittelyä:
Code Block |
---|
const float Pii = 3.14;
|
const-avainsana
...
kertoo,
...
että
...
Pii
...
on
...
vakio,
...
eikä
...
sitä
...
voida
...
muuttaa
...
määrittelyn
...
jälkeen.
...
Muuttuva
...
tieto
...
(volatile)
...
Kun
...
tietoa
...
luetaan
...
esim.
...
joltain
...
laiteportilta,
...
tulee
...
se
...
tehdä
...
seuraavasti:
Code Block |
---|
const volatile unsigned char \*port=0x30; |
Ohjelma
...
lukee
...
portilta,
...
jonka
...
heksadesimaalinen
...
osoite
...
on
...
0x30,
...
arvon,
...
jonka
...
ohjelma
...
ymmärtää
...
vakiona
...
ja
...
siten
...
se
...
kykenee
...
ainoastaan
...
käyttämään
...
ko.
...
muuttujan
...
arvoa,
...
muttei
...
muuttamaan
...
sitä.
...
Volatile-määre
...
tarkoittaa
...
sitä,
...
että
...
muuttujan
...
arvo
...
päivitetään
...
joka
...
viittauskerran
...
yhteydessä,
...
sillä
...
tieto
...
voi
...
muuttua
...
milloin
...
vain.
...
Esikääntäjän
...
ohjaaminen
...
Seuraavassa
...
esikääntäjälle
...
ohjeet
...
siitä
...
mitä
...
ohjelman
...
osia
...
otetaan
...
mukaan
...
käännökseen:
Code Block |
---|
\#define LINUX // Määritellään LINUX \#ifdef LINUX // tämä mukaan jos LINUX on määritelty \#else // tämä mukaan jos LINUX ei ole määritelty \#endif // LINUX |
Toinen
...
yleinen
...
tapa
...
on
...
käänteinen
...
edelliseen
...
verrattuna,
...
eli
...
testataan
...
EIKÖ
...
LINUX
...
ole
...
määritelty:
Code Block |
---|
\#define LINUX // Määritellään LINUX \#ifndef LINUX // tämä mukaan jos LINUX ei ole määritelty \#else // tämä mukaan jos LINUX on määritelty \#endif // \!LINUX Kun samaa |
Useamman headerin käännösongelman ratkaisu
Kun samaa header-tiedostoa
...
käyttää
...
useampi
...
käännösyksikkö
...
(.cpp-tiedosto)
...
, tulee
...
huolehtia,
...
että
...
headerin
...
sisältö
...
tulee
...
ohjelmaan
...
vain
...
kerran
...
(muuten
...
tulee
...
päällekkäisiä
...
määrityksiä).
...
Se
...
hoidetaan
...
esikääntäjää ohjaamalla:
Code Block |
---|
ohjaamalla. \#ifndef Luokka_h \#define Luokka_h // Headerin sisältö tulee #ifndef ja #endif väliin. Tyyliin: // class CLuokka //{ { // ... // } ; \\ \#endif // Luokka_h |
Tämän
...
kun
...
lisää
...
jokaiseen
...
header-tiedostoon,
...
niin
...
välttyy
...
ongelmilta.
...
Jotkin
...
C+
...
+
...
kehitysympäristöt
...
lisäävät
...
nämä
...
automaattisesti
...
ja
...
Microsoft
...
Visual
...
Studio
...
lisää
...
oman
...
#pragma
...
once
...
-määrittelynsä
...
joka
...
ajaa
...
saman
...
asia,
...
eikä
...
luultavastikaan
...
toimi
...
muissa
...
kääntäjissä
...
(ei
...
varmistettu).