Hur kommer det sig att fält utanför funktioner i C++ beter sig som statiska, men inte i C?

Permalänk

Hur kommer det sig att fält utanför funktioner i C++ beter sig som statiska, men inte i C?

Jag brukar alltid sätta vissa fält i vissa .cpp filer som statiska, för att jag vill att fältet skall tillhöra källfilen. Men i C++ verkar jag inte behöva ordet static för att C++17 skall "minnas" vad som fanns där. Men i C99 måste jag använda static.

Har jag missuppfattat det där med static, eller är detta något som skiljer mellan C++17 och C99?

Permalänk
Medlem

https://stackoverflow.com/questions/943280/difference-between...

Stackoverflow som vanligt när det gäller programmeringsfrågor

Visa signatur

Processor: Motorola 68000 | Klockfrekvens: 7,09 Mhz (PAL) | Minne: 256 kB ROM / 512 kB RAM | Bussbredd: 24 bit | Joystick: Tac2 | Operativsystem: Amiga OS 1.3

Permalänk
Medlem

Du behöver inte använda static för att en global variabel ska behålla sitt värde, static gör att du inte kan nå variabeln utanför källfilen.

Permalänk
Skrivet av swesen:

Du behöver inte använda static för att en global variabel ska behålla sitt värde, static gör att du inte kan nå variabeln utanför källfilen.

Så oavsett om jag använder static eller icke static, minnet finns kvar trots allt?

Är static samma sak som inline?

Permalänk
Medlem
Skrivet av heretic16:

Så oavsett om jag använder static eller icke static, minnet finns kvar trots allt?

Är static samma sak som inline?

static är inte samma sak som inline.

Att definiera en variabel som static har två effekter
a) Variabeln syns inte utanför det scope där den definierades
b) Variabeln behåller sitt värde även om koden lämnar det scope:et.

För variabler definierade på topp-nivån av en fil så är b) alltid sann ändå.
För variabler definierade inuti funktioner så är a) alltid sann ändå.

Permalänk
Medlem
Skrivet av heretic16:

Så oavsett om jag använder static eller icke static, minnet finns kvar trots allt?

Är static samma sak som inline?

Allting beror på vilket scope du deklarerar din variabel, om du deklarerar din variabel på filnivå

int a = 7; static int d = 8 int foo(){ static int b = 5; int c = 5; a++; b++; c++; print("a = %d, b = %d, c = %d\n", a, b, c); } int main (){ while(1){ foo(); } }

Kommer generera:
a = 8, b = 6, c = 6
a = 9, b = 7, c = 6
a = 10, b = 8, c = 6
a = 11, b = 9, c = 6
a = 12, b = 10, c = 6

"a" och "b" beter sig alltså likadant, men "b" kan bara nås inifrån "foo" medans "a" kan nås ifrån alla funktioner i samma fil.

Det som skilljer "a" och "d" är att "a" går att nå ifrån andra filer med "extern int a;" som du t.ex. kan deklarera i header filen.

inline är något helt annat, det har med att kompilatorn sätter in funktionen direkt där den kallas istället för att byta exekverings ställe.