define ja const int

C-alkaja

Miksi C:ssä käytetään vakioiden nimeämiseen enemmän muotoa
#define MAX 40
kuin
const int MAX=40;?
Tiedän toki, että tällä ei ole mitään väliä, jos koodaamisessa ei tule virheitä. Kuitenkin, jos koodiin tulisikin juuri tuosta muuttujasta riippuva virhe, niin luulisin, että kääntäjä osaisi antaa enemmän virheilmoitusta jälkimmäisessä tapauksessa, sillä se tietäisi, että MAX on kokonaisluku?

5

950

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • sdgsggd

      Siis...suositellaan käytettäväksi juurikin const int MAX=40...

    • dx

      Siksi koska

      const int MAX = 40;

      ei ole C-kieltä vaan C -kieltä. Osittain syy on historiallinen ja toisaalta define on hieman yleiskäyttöisempi, koska tilalle voi laittaa myös makron tai aliaksen mikä ei oikein const -määreellä onnistu.

    • CCCCCCCC

      1) Syy: Define ei ole muuttuja kun taas const yleensä on (vakio sellainen)

      Tehdäänpä testi, käyttäen kumpaakin tapaa:

      --- ALKAA: use_const.c ---

      const int XX = 40;
      const int YY = 50;

      int main(int argc, char *argv[]) {
      int x = YY*XX;
      }

      --- LOPPUU ---

      vs.

      --- ALKAA: use_define.c ---

      #define XX 40
      #define YY 50

      int main(int argc, char *argv[]) {
      int x = YY*XX;
      }

      --- LOPPUU ---


      Kun nuo ohjelmat käännetään, ja katostaan objdump avulla miltä laskutoimitusrivin (int x = YY*XX) käännös objekti tiedostosta, niin näyttää se seuraavaa omalla kääntäjälläni:

      --- ALKAA: use_const.o ---

      2a: mov 0x4,%eax
      2f: imul 0x0,%eax
      36: mov %eax,0xfffffffc(%ebp)

      0: 28 00
      4: 32 00

      --- LOPPUU ---

      vs.

      --- ALKAA: use_define.o ---

      2a: movl $0x7d0,0xfffffffc(%ebp)

      --- LOPPUU ---


      Elikkä defineä käyttämällä, kääntäjä näki esikääntäjän jälkeen rivin int x = 50*40, ja laski sen valmiiksi, jolloin käännetystä koodista tuli erittäin kompakti. Käyttämällä vakioiksi määriteltyjä muuttujia eli consteja, niin käännös tulos ei ollutkaan yhtä kompakti, vaan käännös meni niin kuin oli kirjoitettu (eli int x = YY*XX), eli muuttujat päätyivät objekti tiedostoon ja lopputuloksena ajonaikaisesti tapahtuva kertolaskun suoritus kahden muuttujan välillä, (ellei sitten lopullinen linkkausvaihe optiomoi tuota kertolaskua pois).


      2) Syy: Define on helppo lisätä header tiedostoon

      Header tiedostoon voi lisätä suoraan esim. "#define XX 30", eikä se tarvitse muuta. Mutta miten menetellä constin kanssa? Jos headeriin lisätään "const int XX = 40;" niin sillon kyseistä headeria ei voi käyttää kuin yhdessä projektin C filessä tai muutoin tulee "multiple defination XX" virhettä. Yksi vaihto ehto ohittaa kyseinen ongelma olisi käyttää headerissa riviä "static const int XX = 40;", mutta toisaalta onko kannattavaa luoda yhdestä vakiosta jokaiselle C tiedostolle omaa paikallista kopiota. Oikea tapa olisi määritellä headeriin vakion prototyyppi, eli "extern const int XX;" rivi, ja sitten yhteen C tiedostoon sen toteutus rivi, eli "const int XX = 40" rivi, mutta toisaalta tämä aiheuttaa sen, että jos halutaan käyttää vain tuota vakiota ohjelmassa, niin kyiseisen vakion toteuksen sisältävä objekti tiedoston on myös linkattava mukaan, (ja toisaalta itse vakion arvoa ei näe ellei sitten omista sitä C tiedostoa jossa on sen toteutus), eli ei riittäkkään pelkkä headeri vakion käyttöön.


      3) Syy: Definella voi myös tulla esiin joitakin virheitä jotka muuton jäisi ajon aikaiseksi

      Kun muuttaa 1:n esimerkkin laskutoimituksen muotoon "YY/XX", ja määritää XX:n nollaksi, niin define toteutuksella kääntäjä herjaa "warning division by zero" koska jako virhe tapahtuu käännöksen aikana, mutta const toteutus menee iloisesti läpi ilman varoituksia. Kummatkin toteutukset tosin kaatuu ajonaikaisesti.

    • 24

      #define MAX 40 on symbolinen vakio

      mites käy jos tuota MAX vakiota laittaa sellaiseen paikkaan johon tuo "40" ei "sovi".
      (vrt. makro, makron parametrien tyyppitarkastus.)

    • Vanha kodari

      Koskapa C:ssä ei toimi
      const int MAX=40;
      int taulukko[MAX];
      C :ssa toimii. Lisäksi C:ssä noita const:eja ei voi käyttää headereissä (tai voi jos sanoo että ne on static).
      Eli summa summarun C:ssä toi const juttuei ole tuettu samallalailla kun C :ssa.

    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. IL - PerSut tykittää - Vaaralliset tappajat vankilaan jopa loppuelämäksi!!

      Entistä rajumpi elinkautinen tulee – Vaaralliset tappajat vankilaan jopa loppuelämäksi Henkirikosten uusijat voidaan ja
      Maailman menoa
      68
      14025
    2. Äärioikeistopurran nukke Petteri Lapanen paniikissa

      Kun Suomen historian paras pääministeri antoi vankan lausunnon, kuinka "keskustelu politiikassa on käpertynyt lähinnä va
      Maailman menoa
      11
      5783
    3. Päivi Räsänen vs. Abbas Bahmanpour

      (Bahmanpour on imaami Helsingissä) Syyttäjä siis jahtaa edelleen Räsästä tämän H-puheista, joissa hän on ilmeisesti vaa
      Maailman menoa
      154
      5511
    4. Demokratian uhka: Perussuomalaiset ja polarisoiva "me ja muut" -ajattelu

      Laurence Rees varoittaa, kuinka demokratian heikkeneminen ja autoritaaristen liikkeiden nousu voidaan liittää "me ja muu
      Maailman menoa
      200
      5099
    5. SIELTÄ SE TULI: Kepu-Kurvinen: "Emme enää lähde punavihreään hallitukseen"

      Nyt muuten nauretaan loppuviikko, että tähänkö kaatui Lindtmanin pääministerihaaveet. "Antti Kurvisen mukaan puolue ei
      Maailman menoa
      115
      4366
    6. "Rauhanomainen" miekkari hesassa: "Eläköön aseellinen vastarinta" - lakana

      Kyseessä on Suomen Palestiinalaisten yhdistyksen viime perjantaina järjestämä ”Hiljainen kynttiläkulkue Palestiinalaiste
      Maailman menoa
      87
      3581
    7. Vanhat miehet eivät muista

      Niinistö muistaa vain Marinin hölmistyneen ilmeen, mutta ei miksi möllötti sen näköisenä. Vanhanen taas ei muuten vaan
      Maailman menoa
      12
      3421
    8. Palkansaajan oikeus nauttia työuransa hedelmistä

      Työeläkejärjestelmä on verrattavissa pyramidihuijaukseen, jossa alemmat tasot, eli nykyiset palkansaajat, toimivat maksa
      Maailman menoa
      109
      3078
    9. HS - Sanna Marinin kirja on priimaluokan vedätys!

      Kirja-arvio|Toivo on tekoja tulisi ensisijaisesti nähdä maineen rahallisen hyödyntämisen voimaannuttavana merkkipaaluna.
      Maailman menoa
      15
      3005
    10. Monella äärivasemmistolaisella C-paperit armeijasta

      Kuinka kävisi sodan tullen noille? Puolustusvoimat huomauttaa, että C-luokituksen saaneiden sijoittumisesta sodan aikan
      Maailman menoa
      55
      2577
    Aihe