2.2.10 Vakiot

Jos ohjelmassa esiintyy vakioita, joiden arvot säilyvät samoina koko ohjelman suoritusajan, mutta saattavat vaihdella ohjelman eri suorituskerrasta toiseen, kannattaa ne määritellä symbolisiksi vakioiksi direktiivin #define avulla. Tällä direktiivillä kerrotaan esikääntäjälle (preprocessor), että jokainen vakion nimen esiintymä ohjelmatekstissä tulee korvata annetulla vakion arvolla. Vakion määrittely on muotoa

#define vakion_nimi oikea_arvo

Etuna vakion määrittelystä on se, että tekemällä muutos yhteen kohtaan ohjelmatiedostoa saadaan muutos näkyviin kaikkialla ohjelmatiedostossa.

Symbolisten vakioiden nimet kirjoitetaan yleensä kokonaan isoilla kirjaimilla. Näin ne on ohjelmatekstissä helppo erottaa muuttujien nimistä.

Esimerkiksi, jos ohjelmassa on määritelty lukumäärää tarkoittava vakio

#define LKM 10

niin sitä voidaan käyttää vaikkapa lausekkeissa

koko_hinta = LKM*kappalehinta;
...
keskiarvo = lukujen_summa/LKM;

Jos sitten halutaankin muuttaa lukumäärä joksikin muuksi, se on hyvin helppoa: Muutetaan vain vakion määrittelyssä oleva luku 10 halutuksi luvuksi.

Jos edellisessä esimerkissä ei olisi käytetty symbolista vakiota LKM, vaan olisi kirjoitettu kaikkiin kaavoihin suoraan haluttu kokonaisluku, niin luvun muuttaminen myöhemmin olisi hyvin hankalaa. Ohjelmasta pitäisi silloin etsiä ja korvata jokainen kyseisen vakion esiintymä erikseen.

Direktiivin #define käytössä tulee olla huolellinen. Kyseessä on esikääntäjälle annettava komento, joka suorittaa tekstuaalisen korvauksen, eli varsinaisessa ohjelmatekstissä suoritetaan jokaisen löydetyn vakion tunnuksen korvaus annetulla tekstillä. Erityisesti on huomattava, että direktiivi ei ole lause, joten sen loppuun ei tule puolipistettä (paitsi jos puolipiste kuuluu itse korvaustekstiin). Myöskään yhtäsuuruusmerkkiä ei käytetä vakion määrittelyssä:

#define LKM 10;  /* VÄÄRIN! Ei puolipistettä!      */
#define LKM=10   /* VÄÄRIN! Ei yhtäsuuruusmerkkiä! */

C++-kielessä on myös toinen tapa määritellä vakioita. Muuttuja voidaan määritellä vakioarvoiseksi alustamisen yhteydessä käyttämällä varattua sanaa const seuraavasti:

const double kerroin = 5.94573;

Tällöin kerroin on liukulukumuuttuja, jota voidaan käyttää esimerkiksi lausekkeissa aivan kuin mitä tahansa liukulukumuuttujaa. Sen arvoa ei kuitenkaan voi muuttaa, ts. kerroin ei saa esiintyä sijoituslauseessa yhtäsuuruusmerkin vasemmalla puolella.

Direktiivillä #define määriteltyjä symbolisia vakioita käytetään yleensä koneesta tai ohjelmointiympäristöstä riippuville vakioille, sekä luvuille, jotka ilmoittavat ohjelman käsittelemän ongelman maksimikoon. Esimerkiksi taulukoiden maksimikoot määritellään #define-direktiivillä (taulukot opitaan myöhemmin). Sanaa const puolestaan käytetään usein silloin, kun halutaan varmistaa, että muuttujan sisältöä ei muuteta vahingossa.

2.2.10.1 Huomautus matemaattisista vakioista

Tunnettuja matemaattisia vakioita, kuten π, ei kannata määritellä itse. Niille löytyvät valmiit suuren tarkkuuden määrittelyt math.h tiedostosta. Jos tarvitset ohjelmassasi π:n arvoa, laita alkuun direktiivi

#include <math.h>

niin π:n arvon sisältävä vakio M_PI on valmiina käytettävissäsi. Sitten voit kirjoittaa ohjelmaasi vaikkapa kaavat

ympyran_ala = M_PI*sade*sade;
ympyran_piiri = 2*M_PI*sade;

jolloin symbolit M_PI muunnetaan käännöksen yhteydessä math.h-kirjastossa määritellyksi π:n arvoksi.