extern avainsana C:ssä koskee C-muuttujia (tietoobjekteja) ja C-funktioita. Pohjimmiltaan extern-avainsana laajentaa C-muuttujien ja C-funktioiden näkyvyyttä. Tämä on luultavasti syy, miksi se nimettiin ulkoiseksi.
Vaikka useimmat ihmiset luultavasti ymmärtävät eron ilmoituksen ja muuttujan tai funktion määritelmän välillä, selvennetään sitä täydellisyyden vuoksi
- Muuttujan tai funktion ilmoitus yksinkertaisesti ilmoittaa, että muuttuja tai funktio on jossain ohjelmassa, mutta niille ei ole varattu muistia. Muuttujan tai funktion ilmoituksella on tärkeä rooli – se kertoo ohjelmalle, mikä sen tyyppi tulee olemaan. Siinä tapauksessa että toiminto ilmoitukset, se myös kertoo ohjelmalle argumentit, niiden tietotyypit, argumenttien järjestyksen ja funktion palautustyypin. Siinä siis kaikki julistuksesta.
- Tulossa määritelmä , kun me määritellä muuttuja tai funktio, kaiken sen lisäksi, mitä ilmoitus tekee, se myös varaa muistia tälle muuttujalle tai funktiolle. Siksi voimme ajatella määritelmää ilmoituksen superjoukkona (tai ilmoituksen määritelmän osajoukkona).
- Extern on ulkoisen lyhyt nimi.
- Ulkoista muuttujaa käytetään, kun tietyn tiedoston on päästävä muuttujaan toisesta tiedostosta.
Externin syntaksi C:ssä
Syntaksi ulkoisen muuttujan määrittämiseksi C:ssä on vain käyttää extern-avainsanaa ennen muuttujan ilmoitusta.
extern data_type variable_name;>
Esimerkki ulkoisesta muuttujasta C:ssä
C
#include> > extern> int> a;>// int var; ->ilmoitus ja määritelmä>> main()> {> >printf>(>'%d'>, a);> > >return> 0;> }> |
>
>
Ulkoisen muuttujan ominaisuudet C:ssä
- Kun kirjoitamme extern some_data_type jokin_muuttujan_nimi; muistia ei ole varattu. Vain muuttujan ominaisuus ilmoitetaan.
- Useita ulkoisen muuttujan ilmoituksia sallitaan tiedostossa. Näin ei ole automaattisten muuttujien kohdalla.
- Ulkoinen muuttuja sanoo kääntäjälle Mene minun soveltamisalani ulkopuolelle ja löydät ilmoittamani muuttujan määritelmän.
- Kääntäjä uskoo, että kaikki, mitä tämä ulkoinen muuttuja sanoi, on totta eikä aiheuta virhettä. Linker antaa virheen, kun se ei löydä tällaista muuttujaa.
- Kun ulkoinen muuttuja alustetaan, tälle varataan muistia ja se katsotaan määritetyksi.
Muuttuja tai funktio voi olla julistettu kuinka monta kertaa tahansa, mutta se voi olla määritelty vain kerran. (Muista perusperiaate, että sinulla ei voi olla kahta sijaintia samalla muuttujalla tai funktiolla).
Nyt takaisin ulkoiseen avainsanaan. Ensinnäkin tarkastellaan externin käyttöä funktioissa. Osoittautuu, että kun funktio on ilmoitettu tai määritelty, ulkoinen avainsana oletetaan implisiittisesti. Kun kirjoitamme.
int foo(int arg1, char arg2);>
Kääntäjä käsittelee sitä seuraavasti:
java 8 ominaisuudet
extern int foo(int arg1, char arg2);>
Koska extern-avainsana laajentaa funktion näkyvyyden koko ohjelmaan, funktiota voidaan käyttää (kutsua) missä tahansa koko ohjelman tiedostossa, mikäli kyseiset tiedostot sisältävät funktion määrityksen. (Kun funktion ilmoitus on paikallaan, kääntäjä tietää, että funktion määritelmä on olemassa jossain muualla, ja se jatkaa ja kääntää tiedoston). Kyse on siis ulkoisista ja toiminnoista.
Harkitse nyt externin käyttöä muuttujien kanssa. Aluksi kuinka tekisit julistaa muuttuja ilman määrittävä se? Tekisitte jotain näin:
extern int var;>
Tässä on ilmoitettu kokonaislukutyyppinen muuttuja var (se ei ole vielä määritetty, joten var:lle ei ole toistaiseksi varattu muistia). Ja voimme tehdä tämän julistuksen niin monta kertaa kuin haluamme.
Miten nyt tekisit määritellä var? Sinä tekisit näin:
int var = 10;>
Tällä rivillä on molemmat ilmoitettu kokonaislukutyyppinen muuttuja var ja määritelty (muista se määritelmä on superjoukko ilmoitus ). Koska tämä on a määritelmä , muistia var on myös varattu. Nyt tulee yllätys. Kun julistimme / määritimme funktion, näimme, että ulkoinen avainsana oli läsnä implisiittisesti. Mutta tämä ei pidä paikkaansa muuttujien kanssa. Jos olisi, niille ei koskaan osoitettaisi muistia. Siksi meidän on sisällytettävä extern-avainsana nimenomaisesti, kun haluamme ilmoittaa muuttujia määrittelemättä niitä. Lisäksi, koska extern-avainsana laajentaa näkyvyyden koko ohjelmaan, käyttämällä extern-avainsanaa muuttujan kanssa, voimme käyttää muuttujaa missä tahansa ohjelmassa, jos sisällytämme sen ilmoituksen, että muuttuja on määritelty jossain.
Yritetään nyt ymmärtää ulkopuolinen esimerkkien avulla.
Esimerkki 1:
c
int> var;> int> main(>void>)> {> >var = 10;> >return> 0;> }> |
>
>
Tämä ohjelma käännetään onnistuneesti. var on määritelty (ja ilmoitettu implisiittisesti) maailmanlaajuisesti.
Esimerkki 2:
c
extern> int> var;> int> main(>void>)> {> >return> 0;> }> |
>
>
Tämä ohjelma käännetään onnistuneesti. Tässä vain var on ilmoitettu. Huomaa var ei ole koskaan käytössä, joten ongelmia ei synny.
sql concat
Esimerkki 3:
c
extern> int> var;> int> main(>void>)> {> >var = 10;> >return> 0;> }> |
>
>
Tämä ohjelma heittää käännökseen virheen (linkitysvaiheen aikana, lisätietoja täältä), koska var on ilmoitettu, mutta sitä ei ole määritelty missään. Pohjimmiltaan varille ei ole varattu muistia. Ja ohjelma yrittää muuttaa sellaisen muuttujan arvon 10, jota ei ole ollenkaan.
Esimerkki 4:
c
// As we are importing the file and henceforth the> // defination> #include 'somefile.h'> > // Declaring the same variable> extern> int> var;> >// int var;> >// It will throw compiler error as compiler will get> >// confused where the variable is defined> > int> main(>void>)> {> >var = 10;> >return> 0;> }> > // Now it will compile and run successfully> |
heittää merkkijono int javaan
>
>
Lähtö:
10>
Huomautus: Tästä syntyy toinen skenaario, mitä jos emme ilmoita externillä yllä olevassa koodinpätkässä,?
Ottaen huomioon oletuksen, että somefile.h sisältää var-määrityksen, tämä ohjelma käännetään onnistuneesti. 'extern'-avainsanaa käytetään muuttujalle, kun ilmoitamme muuttujan yhdessä tiedostossa ja määritämme sen toisessa tiedostossa. Mutta kun tuomme saman tiedoston tiedostoon, jossa se on ilmoitettu, tässä syntyy kääntäjävirhe.
Tämä johtuu siitä, että meidän on silti käytettävä extern-avainsanaa tiedostossa, jossa olemme ilmoittaneet tuon muuttujan kertoaksemme kääntäjällemme, että tämä muuttuja on määritelty jossain muualla kuin vain uutta muistitilaa ei varata muuten se luo uuden muistilohkon mikä 'ulkoisen' avainsanan käyttö on hyödytöntä.
Esimerkki 5:
c
extern> int> var = 0;> int> main(>void>)> {> >var = 10;> >return> 0;> }> |
>
>
Luuletko, että tämä ohjelma toimii? No, tässä tulee toinen yllätys C-standardeista. He sanovat, että jos muuttuja on vain ilmoitettu ja alustaja on myös tuon ilmoituksen mukana, muisti tälle muuttujalle varataan - toisin sanoen kyseistä muuttujaa pidetään määritellynä. Siksi C-standardin mukaisesti tämä ohjelma käännetään onnistuneesti ja toimii.
Tämä oli siis alustava katsaus C:n ulkoiseen avainsanaan.
Lyhyesti sanottuna voimme sanoa:
- Ilmoitus voidaan tehdä kuinka monta kertaa tahansa, mutta se voidaan määrittää vain kerran.
- extern-avainsanaa käytetään laajentamaan muuttujien/funktioiden näkyvyyttä.
- Koska funktiot ovat oletusarvoisesti näkyvissä kaikkialla ohjelmassa, externin käyttöä ei tarvita funktiomäärittelyissä tai -määrittelyissä. Sen käyttö on implisiittistä.
- Kun externiä käytetään muuttujan kanssa, se vain ilmoitetaan, ei määritellä.
- Poikkeuksena, kun ulkoinen muuttuja ilmoitetaan alustuksen kanssa, se otetaan myös muuttujan määritelmäksi.