previous next Up Title Contents Index

7.5 C++:n vakiot


Koska makrojen käyttöön liittyy tiettyjä tyyppitarkistuksiin/oikeellisuuskirjoitukseen liittyviä riskejä, kannattaa C++:ssa mieluummin käyttää tyypitettyjä vakioita (seuraavan esimerkin const- rivit toimivat tosin C- kielessäkin):

c-alk\hello2.cpp - tervehdys "vakioksi"

	// Ohjelma tulostaa tekstin Hello world! 
	#include <iostream.h>
	const char *TERVE = "Hello ";
	const char *MAAILMA = "world";
	
	int main(void)
	{
	  cout << TERVE << MAAILMA << "!" << endl;
	  return 0;
	}
Valitettavasti on tilanteita, joissa makroja on edelleen lähes pakko käyttää. Esimerkiksi merkkijonojen yhdistäminen TERVE MAAILMA tyyliin ei onnistu. Myöhemmin opimme joitakin muitakin tilanteita, joissa makrot ovat "välttämättömiä". Erityisesti lukuvakioiden määrittelyssä const- vakiot ovat omimmillaan:

c-alk\kuutio.cpp - monikulmion tiedot vakioksi

	// Ohjelma tulostaa tietoja monitahokkaasta
	#include <iostream.h>
	#include <iomanip.h>
	const char *TAHOKAS   = "Kuutiossa";
	const int KARKIA      =  8;
	const int SIVUTASOJA  =  6;
	const int SARMIA      = 12;
	int main(void)
	{
	  cout<<setw(20)<<TAHOKAS<<" on "<<setw(2)<<KARKIA    <<" kärkeä,\n";
	  cout<<setw(20)<<" "    <<"    "<<setw(2)<<SIVUTASOJA<<" sivutasoa,\n";
	  cout<<setw(20)<<" "    <<"    "<<setw(2)<<SARMIA    <<" särmää" << endl;
	  return 0;
	}

Tehtävä 7.54 Vakiot #define

Päättele seuraavasta esimerkistä miksi const- vakiot ovat parempia kuin #define - makrot.

c-alk\const.cpp - vakion ja #definen erot

	// Ohjelmalla tutkitaan mikä ero on const ja #define -vakioiden välillä
	#include <iostream.h>
	const int sormia = 1 + 4;
	#define VARPAITA 1 + 4	
	int main(void)
	{
	  int syht = 2 * sormia;
	  int vyht = 2 * VARPAITA;
	  cout << "Sormia = " << syht << " ja varpaita = " << vyht << endl;
	  return 0;
	}
Selitä mistä virhe johtuu? Miten virhe saadaan tässä tapauksessa poistettua?


previous next Up Title Contents Index