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

970

    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. Me työeläkeläiset äänestämme SDP:tä

      SDP on luonut koko työeläkejärjestelmän, jonka hedelmistä saamme nyt nauttia. Kansaneläkelaitos on Maalaisliiton tekele,
      Maailman menoa
      182
      5107
    2. Eikö tunnukin kamalalta, kun en

      anna periksi vaikka parhaasi olet tehnyt antaaksesi täystyrmäyksen? Ja kyllähän minä monta iskua olen saanut ja maannut
      Ikävä
      81
      3656
    3. Persut on Suomen mamutuspuolue nro 1.

      Heti ensimmäisenä persuvuonna 2015 maahantoivat Suomeen 35 tuhatta kunniavierastaan. Tuoreimpana persuvuonna 2025 pers
      Maailman menoa
      7
      3125
    4. SDP:n johto pesi kätensä häirintäkohusta

      "Suurimman oppositiopuolue SDP:n johto olisi todennäköisimmin halunnut vaieta puolueen ympärillä velloneen häirintäkohun
      Maailman menoa
      25
      3078
    5. SDP on selvästi paras valinta äänestyskopissa

      Puolueella on arvomaailma kohdallaan, sillä on hyvä CV itsenäisen Suomen historiassa vastuunkantajana ja hyvinvointivalt
      Maailman menoa
      61
      2697
    6. SDP:n selitykset ontuu pahasti - "On käsitelty heti, mutta kukaan ei tiedä"

      Kokoomuslaiset pistää taas demareita nippuun. Tuppuraisen mukaan mukaan SDP:n useat ahdistelutapaukset on käsitelty het
      Maailman menoa
      41
      2316
    7. Kenen juontajan pitäisi voittaa tänään Kultainen Venla? Ehdolla Pimiä, Holma ja Vaaherkumpu

      Kultainen Venla gaalassa jaetaan tänään tv-alan palkintoja. Yksi suosituimmista kategorioista on Juontaja. Vappu Pimiä
      Suomalaiset julkkikset
      103
      2253
    8. Oletko nainen turhautunut, kun en tule juttelemaan siellä?

      Haluaisin tottakai tulla. Älä käsitä väärin. Ehkä ensi kerralla?
      Ikävä
      29
      2117
    9. Antti Lindtman: "Ainahan kaikenlaisia huhuja liikkuu"

      Näin hän siis vastaa SDP:n häirintäkohuun, väistelee vastuutaan Juttuhan on niin, että Lindtman ja Tuppurainen on tasan
      Maailman menoa
      75
      2095
    10. Mitä saa sanoa?

      Palstalla tänään sanottua: ” Kaikki riippuu siitä, miten asian esittää,” Onko siis niin, että saa muita pomottaa ja
      80 plus
      92
      2059
    Aihe