Skip to content

Commit 434ab10

Browse files
committed
added rant about external, inline, static
1 parent d92ccd9 commit 434ab10

3 files changed

Lines changed: 74 additions & 5 deletions

File tree

public/lectures/move.md

Lines changed: 74 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,13 @@ int main() {
7474
} // ~A
7575
```
7676
77-
Konštruktor sa zavolá iba ak sa funkcia `f` zavolá s parametrom `i == 0`. Deštruktor sa "zaregistruje" aby sa zavolal, keď program skončí.
77+
* Konštruktor sa zavolá iba ak sa funkcia `f` zavolá s parametrom `i == 0`. Deštruktor sa "zaregistruje" aby sa zavolal, keď program skončí.
7878
7979
---
8080
8181
## `thread_local`
8282
83-
Premenná sa inicializuje iba raz pre konkrétny thread, o tomto uvidíme viacej na inej prednáške
83+
* Premenná sa inicializuje iba raz pre konkrétny thread, o tomto uvidíme viacej na inej prednáške
8484
8585
---
8686
@@ -138,7 +138,76 @@ std::string GetAppVersion() {
138138
139139
```
140140

141-
Všetky globálne premenné sú inicializované pred volaním `main`. Tu jedna závisí od druhej v inom súbore (*translation unit*) a to je nedefinované správanie.
141+
* Všetky globálne premenné sú inicializované pred volaním `main`. Tu jedna závisí od druhej v inom súbore (*translation unit*) a to je nedefinované správanie.
142+
143+
144+
## Globálne statické premenné
145+
146+
* Štandardné globálne premenné sú viditeľné v celom projekte (vo všetkých translation units, sú *external linkage*)
147+
* Statické globálne premenné sú viditeľné iba v jednom translation unit (sú *internal linkage*)
148+
149+
### Pre bežné globálne premenné
150+
151+
```cpp
152+
// file1.cpp
153+
int global_variable = 67;
154+
155+
// file2.cpp
156+
extern int global_variable; // will be the same variable
157+
```
158+
159+
* `extern` hovorí kompilátoru, že táto premenná je definovaná niekde inde a až linker ju spojí dohromady
160+
* `extern` sa dá použiť aj s funkciami, ak potrebujeme použiť funkciu z iného translation unit, ale nemáme k nemu header súbor
161+
* Funkcie sú ale `extern` implicitne, teda `int func();` je to isté ako `extern int func();`
162+
163+
164+
### Pre statické globálne premenné
165+
166+
```cpp
167+
// file1.cpp
168+
static int static_global_variable = 67;
169+
170+
// file2.cpp
171+
//extern int static_global_variable; // error
172+
static int static_global_variable = 43; // different variable
173+
```
174+
175+
```cpp
176+
// file1.cpp
177+
int global_variable = 67;
178+
179+
// file2.cpp
180+
static int global_variable = 43; // different variable
181+
```
182+
183+
184+
### Bez všetkývch týchto špecifikátorov
185+
186+
```cpp
187+
// file1.cpp
188+
int global_variable = 67;
189+
190+
// file2.cpp
191+
int global_variable = 43; // error: redefinition of 'global_variable', linker error
192+
```
193+
194+
195+
### Riešenie pomocou `inline`
196+
197+
* V C++17 existuje kľúčové slovo `inline` pre globálne premenné, ktoré umožňuje definovať premennú v hlavičkovom súbore bez linker chyby
198+
199+
```cpp
200+
// file1.cpp
201+
inline int global_variable = 67;
202+
inline int global_variable_2 = 102;
203+
204+
// file2.cpp
205+
inline int global_variable = 43; // undefined, ODR violation
206+
inline int global_variable_2 = 102; // OK
207+
```
208+
209+
* ODR je *One Definition Rule*, hovorí, že v celom programe musí byť iba jedna definícia premennej/funkcie, deklarácie môžu byť viaceré
210+
* Ak sa ODR poruší, tak je to nedefinované správanie programu, ale väčšinou to skončí linker chybou (nie je vyžadované štandardom)
142211

143212
---
144213

@@ -481,7 +550,7 @@ int main(int argc, char* argv[]) {
481550
* Môžeme použiť volanie hodnotou, referenciou (modifikovateľnou), alebo konštantnou referenciou
482551
* Každé má svoje výhody a nevýhody
483552
484-
![Homer Simpson in power plant](./lectures/7_move/simpson_power_plant.png)
553+
![Homer Simpson in power plant](./lectures/move/simpson_power_plant.png)
485554
486555
---
487556
@@ -514,7 +583,7 @@ void func(const std::string& s) {
514583
515584
## `const` by mal vždy ostať `const`
516585
517-
![Do not use const_cast](./lectures/7_move/const_cast.png)
586+
![Do not use const_cast](./lectures/move/const_cast.png)
518587
519588
---
520589
File renamed without changes.

0 commit comments

Comments
 (0)