2017-09-04 1 views
-4

wäre es am besten globale Variablen zu verwenden, wie zum Beispiel:Verwenden Sie globale Variablen oder mehrere Parameter?

int bumNum; 
int extraNum; 
bool isIt; 

void setup() 
{ 
    std::cin >> bumNum; 
    std::cin >> extraNum; 
    isIt= false; 
} 

void anotherFunc() 
{ 
    //do something with the global variables 
} 

int main() 
{ 
    setup(); 
    anotherFunc(); 
    return 0; 
} 

oder lokalen Variablen wie:

void setup(int& bumNum, int& extraNum, bool& isIt) 
{ 
    std::cin >> bumNum; 
    std::cin >> extraNum; 
    isIt= false; 
} 

void anotherFunc(int& bumNum, int& extraNum, bool& isIt) 
{ 
    //do something with the global variables 
} 

int main() 
{ 
    int bumNum; 
    int extraNum; 
    bool isIt; 
    setup(bumNum, extraNum, isIt); 
    anotherFunc(); 
    return 0; 
} 

Die erste Option weniger tippen auf die andere Option im Vergleich ist. Die Sache ist, dass globale Variablen nicht wirklich als ein Freund betrachtet werden:/Oh, und es gibt mehr Initialisierungen in der zweiten Option.

+7

Hast du das wirklich fragen? Natürlich ist die Verwendung von Parametern besser, obwohl Sie sie vermutlich in eine Struktur oder Klasse einpacken möchten. Und "es gibt mehr Initialisierungen in der zweiten Option" - nein, es gibt keine .. –

+1

Globale Variablen eine fast * nie * eine gute Idee. Sicher, jede Regel hat Ausnahmen, aber die Regel "verwende keine Globalen" hat * sehr * wenige - und wenn du sie brechen musst, dann weißt du verdammt gut warum und hast einen * sehr * guten Grund (und nein; " Bequemlichkeit "zählt nicht". –

+0

@JesperJuhl Also wäre es wirklich besser, so viel mehr für das gleiche Ergebnis einzugeben? :/ – Dip

Antwort

8

Mit globalen Variablen führen Sie einen globalen Zustand, der von sich verschiedenen Themen hat:

  • Probleme mit Concurrency (wenn Sie Multithreading hinzufügen, müssen Sie diejenigen zu schützen mit irgendeiner Art von Mutex anfangen zu denken),

  • es nicht Maßstab,

  • im Laufe der Zeit, wie Sie die Anzahl solcher Variablen erhöhen, ist es mehr und mehr verwirrend als für die Verwendung wird, welche Variablen arbeitet,

um nur einige zu nennen.

Um Ihre Frage zu beantworten - verwenden Sie Parameter über den globalen Zustand, wo immer möglich.

+7

Nicht zu erwähnen; "Tight Coupling", "statisches Initialisierungsfiasko", "Lebensdauerprobleme, die zum Absturz führen", "Verschmutzung des globalen Namensraums" und vieles mehr. –

0

Nutzungsstruktur:

struct Foo 
{ 
    int bumNum = 0; 
    int extraNum = 0; 
    bool isIt = false; 
}; 

std::istream& operator >> (std::istream& is, Foo& foo) 
{ 
    std::cin >> foo.bumNum; 
    std::cin >> foo.extraNum; 
    foo.isIt= false; 
    return is; 
} 

void anotherFunc(Foo& foo) 
{ 
    //do something with the global variables 
} 

int main() 
{ 
    Foo foo;  
    std::cin >> foo; 
    anotherFunc(foo); 
}