Kommentit
vastaus
”#define” on esikäsittelydirektiivi. Se määrittelee lable-arvon ja arvon, joka sijoitetaan esikäsiteltyyn lähdekoodiin samaan paikkaan jokaisessa tarran esiintymässä. Mitään tyyppiä ei ole määritelty, joten se on merkkijonojen perus- ja tyhmäkorvaus ennen kokoamista. Sitten se voi johtaa virheisiin tai väärinkäsityksiin kääntämisen aikana.
”const int xxx” määrittelee tyypin ja lukitsee kyseisen ilmentymän arvon. Tämän menetelmän käyttäminen on turvallisempaa. Kääntäjä voi tarkistaa tyypin virheet ja heittää viestejä (tai rikkoa kokoelman), jos teit virheen.
Esimerkki:
#define A 5 int dummy_integer = A
… esikäsitellään muodossa …
int dummy_integer = 5
… ja kääntäjä lukee tämän lauseen.
Jos muistan kuitenkin hyvää, voit aina korvata esikäsittelydirektiivin seuraavasti:
#define A 5 int dummy_integer = A //some code here #undef A #define A "my_string" std::cout << A
Se ei ole hyvä. Käyttämällä muuttujaa ”const” sen sijaan et voi muuttaa muuttujan arvoa (eikä tyyppiä) (ja siten se määrittelee ”vakion”).
#define
sijasta#include
. Ammattimaisempi tapa nastojen ilmoittamiseksi onconst int myPin = ...
. Tämä auttaa kääntäjää ymmärtämään, että se on vakioarvo eikä tallennusta tarvita. Tämä on hieman parempi kuin#define
, koska se antaa koontitiedot tietotyypistä.int
-menetelmä on parempi?enum
-merkkiä kokonaisluku- tai merkkivakioihin eikä joko#define
taiconst int
. Katso hyväksytty vastaus kysymykseen Onko vakioille parempi käyttää #define tai const int? ,