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):
// 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:
// 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; }
// 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; }