Bei C++ kannst du im Gegensatz zu C beliebigen Code sowohl vor, als auch nach main() ausführen. Das kann schnell dazu führen, dass globale Variablen noch nicht initialisiert sind, wenn sie von einem Modul verwendet werden. Die STL führt massenhaft Code vor und nach main() aus, auch hinter der Bühne und vor allem dann, wenn du STL-Typen als globale Variablen einsetzt.
Wie gesagt, bei gutem alten C (ohne Plusplus) besteht dieses Problem in der Form überhaupt nicht.
Da es in deiner Frage um C++ und nicht C geht, solltest du vielleicht keine nackten Arrays, sondern std::vector in Erwägung ziehen. Aaaaaber, das wird dir u. U. um die Ohren fliegen, wenn du einen Vektor als globale Variable definierst, und von einer anderen Übersetzungseinheit darauf zugreifen willst.
Trotzdem erst mal, als schlechtes Beispiel:
/* header.hh */
#include <vector>
extern std::vector<int> buf; // <- mit "extern"
/* source.cc */
#include "header.hh"
std::vector<int> buf; // <- kein "extern"
/* modul1.cc */
#include "header.hh"
void func1() {
buf.push_back(123);
}
/* modul2.cc */
#include "header.hh"
void func2() {
buf.clear();
}
Das ist sehr schlecht und wird zu Bugs führen. Könnte aber auch sein, dass es problemlos funktioniert ... ist eben einfach sog. "undefiniertes Verhalten". :)
Globale Variablen solltest du deshalb immer in Funktionen einwickeln und nur eine Referenz darauf zurück geben:
/* header.hh */
#include <vector>
std::vector<int>& get_buf();
/* source.cc */
#include "header.hh"
std::vector<int>& get_buf() {
static std::vector<int> buf;
return buf;
}
/* modul1.cc */
#include "header.hh"
void func1() {
get_buf().push_back(123);
}
/* modul2.cc */
#include "header.hh"
void func2() {
get_buf().clear();
}
Mit dieser Vorgehensweise erschlägst du alle Probleme zwischen Modulen und unvertiger Initialisierung mit einem Schlag, wenn du bereit bist, dafür minimalen Overhead in Kauf zu nehmen, der sich in den meisten Situationen nicht weiter negativ bemerkbar machen wird.
Weil es in deiner Frage um C++ ging, bis hierher der C++ Teil. Da dein Code Beispiel aber eher C ist, und du ja an reinen Arrays interessiert bist, es aber trotzdem um C++ geht, ist die Aufgabenstellung deines Lehrers leider nicht trivial zu beantworten, so dass der Code auch zuverlässig und sicher funktioniert.
Im Großen und ganzen musst du einen globalen Zeiger mit Null initialisieren und eine Arraylänge als zusätzliche Variable ebenfalls mit 0 initialisieren. Dann musst du Funktionen drum herum bauen, die dynamisch Speicher reservieren und evtl. wieder freigeben, und sich um den ganzen Rest kümmern. Aber ohne ordentliche Kapselung wird das im Chaos enden.
Wenn du schon mit C++ arbeitest, baue dir mindestens eine anständige Klasse drum herum, welche die interne Buchführung übernimmt.
Ich glaube, deinem Lehrer ist überhaupt nicht klar, mit welchen subtilen Komplikationen bei dieser Aufgabenstellung zu rechnen ist. Ich möchte wetten, er unterschätzt die Fallstricke gewaltig, und hat mindestens die Hälfte der Nebeneffekte nicht bedacht. XD
LG, Sophie ^^
💡 Woher ich das weiß: Bjarne Stroustrup