En variebels egenskaper (i ansi c)
En variebels egenskaper (i ansi c)
Detta är en fortsatt diskussion från 'mplab C30 include funktion' diskussionen. mplab C30 include funktion diskussionen.
Två variablar kan inte ha samma namn i samma 'name space' och i samma 'scope'.
namespaces i c:
struct, enum, union taggar
objekten inne i en struct, enum, union taggar
andra variabel/typ namn
och därför kan jag deklarera en strukt så här:
struct a
{
int a;
} a;
eftersom alla är i olika namespaces. (känns som om jag har glömt ett namespace?)
speakman, tack för länken!
På tal om static i den andra tråden. I C++ har den ju tre betydelser, dem två redan nämnda + om den används i en klass betyder det: denna variabel tillhör klassen inte objektet. Någon som vet tanken bakom att återanvända namnet: static till alla dessa betydelser?
Två variablar kan inte ha samma namn i samma 'name space' och i samma 'scope'.
namespaces i c:
struct, enum, union taggar
objekten inne i en struct, enum, union taggar
andra variabel/typ namn
och därför kan jag deklarera en strukt så här:
struct a
{
int a;
} a;
eftersom alla är i olika namespaces. (känns som om jag har glömt ett namespace?)
speakman, tack för länken!
På tal om static i den andra tråden. I C++ har den ju tre betydelser, dem två redan nämnda + om den används i en klass betyder det: denna variabel tillhör klassen inte objektet. Någon som vet tanken bakom att återanvända namnet: static till alla dessa betydelser?
Tack, nu hänger jag med! 
Jag får för mig att static (för kompilatorn) egentligen gör samma sak, och därav att den återkommer.
Men sedan ses det ju olika ut av användaren förstås...
Men "static" för funktioner finner heller inte jag någon riktigt bra gemensam egenskap för.
Vi flyttar även hit länken du nämner. En nyttig sådan!

Jag får för mig att static (för kompilatorn) egentligen gör samma sak, och därav att den återkommer.
Men sedan ses det ju olika ut av användaren förstås...
Men "static" för funktioner finner heller inte jag någon riktigt bra gemensam egenskap för.
Vi flyttar även hit länken du nämner. En nyttig sådan!

se det sår här istället: en "static" variabel flyttas alltid till data sektionen, och så byter man namn på den för att inte krocka med nån annan variabel.
t.ex. i filen.c skulle man kunna ha
dessa görs då om till något som skulle kunna likna den här koden
t.ex. i filen.c skulle man kunna ha
Kod: Markera allt
class bar {
public: static int var3;
};
static int var1 = 0;
int bar::var3 = 0;
int foo() {
static int var2 = 0;
var2++;
return var2 + bar::var3 + var;
}
Kod: Markera allt
int _fil_filen_var1 = 0;
int _funk_foo_var2 = 0;
int _klass_bar_var3 = 0;
class bar {
};
void foo() {
_funk_foo_var2++;
return _klass_bar_var3 + _funk_foo_var2 + _fil_filen_var1;
}
Jag har hört att man använt static i båda betydelserna för att slippa lägga till ett reserverat ord. Käns iofs som att det är någon som hittat på det bara för att kunna svara på frågan sas 
Lite kuriosa som du kanske vet: Förutom 'static' kan variabler i funktioner vara 'auto' eller 'register'. Skriver man 'auto' händer inget (det är default, en vanlig stackvariabel) och skriver man 'register' tipsar man kompilatorn om att den bör ligga i ett register. Dagens kompilatoter är dock smartare än dagens programmerare så det är ingen mening att anvädna det. Just det; variabler på stacken heter automatiska variabler i C-lingo. Kan vara bra att veta.

Lite kuriosa som du kanske vet: Förutom 'static' kan variabler i funktioner vara 'auto' eller 'register'. Skriver man 'auto' händer inget (det är default, en vanlig stackvariabel) och skriver man 'register' tipsar man kompilatorn om att den bör ligga i ett register. Dagens kompilatoter är dock smartare än dagens programmerare så det är ingen mening att anvädna det. Just det; variabler på stacken heter automatiska variabler i C-lingo. Kan vara bra att veta.
och const kan en varialbel vara. Eller pekare på const. Eller const pekare på const. Eller const pekare på variabel pekare på const data. Tror jag men där någonstans är jag vilse.
restrict är inte bara kuriosa utan en ny grej som gör att man kan göra mer optimala numeriska rutiner bla. Fram till nu har de bästa beräkningsprogrammen ofta varit skrivna i FORTRAN men med restrict kan man göra samma sak i C.
restrict är inte bara kuriosa utan en ny grej som gör att man kan göra mer optimala numeriska rutiner bla. Fram till nu har de bästa beräkningsprogrammen ofta varit skrivna i FORTRAN men med restrict kan man göra samma sak i C.
>På tal om static i den andra tråden. I C++ har den ju tre betydelser.
Om du talar om statisk vilket static betyder så har den tre betydelse både i ANSI C och C++. två av dom har jag förklarat i en anna tråd (dock i enkla termer), den tredje är att en global variable är också statisk, vilket vill säja att den är varaktig under hela programkörningen.
kompilatorn reserverar minnes utryme för denna variabel (den initeras en gång)
en extern static variabler begränsas synligheten till en fil samt till underliggande funktioner, detta har en mening om man har flera filer som ett program bygger på, man kan isolera variabler till en fil och inte låta dom vara synliga i alla filer.
Sen om man i C++ deklarerar en static metod så tillhör den klassen, med andra ord så skapas enbart en metod som alla objekt anropar, ett objekt skapas normalt en ny instans för metoden i varje nytt objekt som skapas.
Man har en väldig nytta av detta i tex. en plattform som Windows, en CALLBACK metod måste vara statisc för att operativsystemet skall kunna anropa rätt adress, skulle varje objekt skapa en instans för tex. en CALLBACK metod så skulle det vara omöjligt att veta vilket objekt som skulle anropas.
Om du talar om statisk vilket static betyder så har den tre betydelse både i ANSI C och C++. två av dom har jag förklarat i en anna tråd (dock i enkla termer), den tredje är att en global variable är också statisk, vilket vill säja att den är varaktig under hela programkörningen.
kompilatorn reserverar minnes utryme för denna variabel (den initeras en gång)
en extern static variabler begränsas synligheten till en fil samt till underliggande funktioner, detta har en mening om man har flera filer som ett program bygger på, man kan isolera variabler till en fil och inte låta dom vara synliga i alla filer.
Sen om man i C++ deklarerar en static metod så tillhör den klassen, med andra ord så skapas enbart en metod som alla objekt anropar, ett objekt skapas normalt en ny instans för metoden i varje nytt objekt som skapas.
Man har en väldig nytta av detta i tex. en plattform som Windows, en CALLBACK metod måste vara statisc för att operativsystemet skall kunna anropa rätt adress, skulle varje objekt skapa en instans för tex. en CALLBACK metod så skulle det vara omöjligt att veta vilket objekt som skulle anropas.
När jag ändå är igång så kan jag ge ett simpelt exempel vad en static variable kan användas till, om man definiera tex. en räknare "Counter" i en klass, så skapas denna en gång, det innebär att man tex. skulle kunna plussa på ett för varje objekt som skapas.
Alla objekt kan då ifrån denna variable veta exakt hur många objekt som existerar av denna klass.
Variabeln är varaktig den återanvänds inte!
Exemplet kan också tillämpas på C tex. om man definierar den inom en funktion så kan den räkna hur många gånger funktionen anropas ( nu har man säkerligen ingen nytta av detta men det borde förklara vad varaktig betyder)
Alla objekt kan då ifrån denna variable veta exakt hur många objekt som existerar av denna klass.
Variabeln är varaktig den återanvänds inte!
Exemplet kan också tillämpas på C tex. om man definierar den inom en funktion så kan den räkna hur många gånger funktionen anropas ( nu har man säkerligen ingen nytta av detta men det borde förklara vad varaktig betyder)
Senast redigerad av BoF 12 oktober 2007, 23:01:46, redigerad totalt 1 gång.