h2. 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}
#define PII 3.14
{code}
Edellä mainitulla tiedolla ei kuitenkaan ole tyyppiä ja siksi C++:ssa tulisi käyttää määrittelyä:
{code}
const float Pii = 3.14;
{code}
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}
const volatile unsigned char *port=0x30;
{code}
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.
h2. Esikääntäjän ohjaaminen
Seuraavassa esikääntäjälle ohjeet siitä mitä ohjelman osia otetaan mukaan käännökseen:
{code}
#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
{code}
Toinen yleinen tapa on käänteinen edelliseen verrattuna, eli testataan EIKÖ LINUX ole määritelty:
{code}
#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
{code}
h2. 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}
#ifndef Luokka_h
#define Luokka_h
// Headerin sisältö tulee #ifndef ja #endif väliin. Tyyliin:
class CLuokka
{
// ...
};
#endif // Luokka_h
{code}
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). |