Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 4.0
Wiki Markup
h2. Vakiot

Sellaiset 

Vakiot

...

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

Useamman headerin käännösongelman ratkaisu

...


{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).