Thread View: de.comp.lang.c++
5 messages
5 total messages
Started by Boris Lohner
Sat, 25 Nov 1995 01:07
Kommandozeilenargumente bevor main()
Author: Boris Lohner
Date: Sat, 25 Nov 1995 01:07
Date: Sat, 25 Nov 1995 01:07
37 lines
1469 bytes
1469 bytes
Hallo zusammen,
ich will im Konstruktor eines globalen Objektes die Kommandozeilenargumente
abfragen, weil diese das Verhalten des globalen Objektes beeinflussen
sollen.
Das Objekt erst in main(...) zu initialisieren ist unguenstig, da mehrere
andere ebenfalls globale Objekte bereits vor main(...) Gebrauch von diesem
bestimmten Objekt machen.
Leider hab ich bis jetzt keine Loesung fuer dieses Problem gefunden.
// Beispielprograemmchen
class Foo{
public:
Foo(){ /* hier wuerden die Kommandozeilenargumente benoetigt */ }
/* ... */
};
Foo foobar;
int main(int argc,char** arg)
{
/* ... */
}
Die Frage ist also:
Wie komm ich auf portable Weise noch vor dem Eintritt in main(...) an die
Kommandozeilenargumente heran?
Mit Dank in vorraus fuer Anregungen und Ideen
Boris
PS: Literaturhinweise zur Problematik globaler Objekte sind natuerlich auch
sehr willkommen (dann spar ich mir naemlich die naechsten fragen ;-)
... Please send no mail >16k
Re: Kommandozeilenargumente bevor main()
Author: Ralf W. Stephan
Date: Sat, 25 Nov 1995 09:08
Date: Sat, 25 Nov 1995 09:08
37 lines
1436 bytes
1436 bytes
Boris Lohner writes:
> Hallo zusammen,
> ich will im Konstruktor eines globalen Objektes die Kommandozeilenargumente
> abfragen, weil diese das Verhalten des globalen Objektes beeinflussen
> sollen.
> Das Objekt erst in main(...) zu initialisieren ist unguenstig, da mehrere
> andere ebenfalls globale Objekte bereits vor main(...) Gebrauch von diesem
> bestimmten Objekt machen.
> Leider hab ich bis jetzt keine Loesung fuer dieses Problem gefunden.
Geht nicht, hab ich auch schon probiert. Das Problem ist, daß Du
auf die Reihenfolge der Konstruktion globaler Objekte keinen Einfluß
hast. Generell sind Globals sowieso schlechter Stil, denn wenn Du
irgendwann Exceptions einbauen willst, brauchst Du so eine Konstruktion:
int main (int argc, char** argv)
{
for (;;)
{
try { if (the_real_main (argc,argv)) break; }
catch (exception x)
{
...
}
}
return 0;
}
bool the_real_main (int argc, char** argv)
{
// Begin initialization
}
ralf
--
PGP: 1024/0xA713ECE9 2047/0xC8E605F5
Re: Kommandozeilenargumente bevor main()
Author: Ullrich von Bassewitz
Date: Sat, 25 Nov 1995 13:17
Date: Sat, 25 Nov 1995 13:17
35 lines
1999 bytes
1999 bytes
Boris Lohner (boris@raybbs.camelot.de) wrote:
> Die Frage ist also:
> Wie komm ich auf portable Weise noch vor dem Eintritt in main(...) an die
> Kommandozeilenargumente heran?
Überhaupt nicht.
Das Problem liegt in Deinem Falle darin, daß Du mit Deinen globalen Objekten
nicht vorsichtig gewesen bist, bzw. diese falsch nutzt. Der Satz
> Das Objekt erst in main(...) zu initialisieren ist unguenstig, da mehrere
> andere ebenfalls globale Objekte bereits vor main(...) Gebrauch von diesem
> bestimmten Objekt machen.
deutet auf Deinen Irrtum hin: Es gibt _keine_ garantierte Reihenfolge für
die Initialisierung globaler Objekte. D.h. Du kannst Dich _nie_ darauf
verlassen, daß Deine globalen Objekte in einer bestimmten Abfolge zur
Verfügung stehen. Selbst wenn Du auf irgendeine Art und Weise an Kopien
von argc und argv rankommst, dann ist immer noch nicht garantiert, daß Dein
globales Objekt, das diese auswertet, auch vor allen anderen globalen
Objekten, die davon abhängen, initialisiert wird.
Globale Objekte sind für manche Probleme elegante Lösungen. Du mußt aber
darauf achten, daß es keinerlei implizite oder explizite Abhängigkeiten
dieser Objekte untereinander gibt, und daß Du nicht implizit oder explizit
von einer bestimmten Reihenfolge bei der Initialisierung oder beim Aufruf
der Destruktoren ausgehst.
Gruß
Uz
--
Ullrich von Bassewitz uz@ibb.schwaben.com
Re: Kommandozeilenargumente bevor main()
Author: Karl-Heinz Krause
Date: Sat, 25 Nov 1995 16:42
Date: Sat, 25 Nov 1995 16:42
37 lines
1718 bytes
1718 bytes
Am 25. Nov. 95 schrieb Boris Lohner (boris@raybbs.camelot.de): > Hallo zusammen, > ich will im Konstruktor eines globalen Objektes die Kommandozeilenargumente > abfragen, weil diese das Verhalten des globalen Objektes beeinflussen > sollen. > Das Objekt erst in main(...) zu initialisieren ist unguenstig, da mehrere > andere ebenfalls globale Objekte bereits vor main(...) Gebrauch von diesem > bestimmten Objekt machen. > Leider hab ich bis jetzt keine Loesung fuer dieses Problem gefunden. [ ... ] > Die Frage ist also: > Wie komm ich auf portable Weise noch vor dem Eintritt in main(...) an die > Kommandozeilenargumente heran? Auf portable Weise gar nicht, da die Definierer von C++ das in ihrer grenzenlosen Verblendung nicht vorgesehen haben. Die verschiedenen C++-Compiler bieten häufig Lösungen dafür. Bei Borland gibt es globale Variablen _argc und _argv, die in dos.h deklariert sind. Andere Compiler bieten evtl. andere Lösungen. Eine semiportable Methode wäre es, die verschiedenen Möglichkeiten über #ifdef zu unterscheiden. #ifdef __BORLAND #include <dos.h> #else ... #endif ... Karl-Heinz Krause
Re: Kommandozeilenargumente bevor main()
Author: Olaf Kock
Date: Sun, 26 Nov 1995 00:00
Date: Sun, 26 Nov 1995 00:00
27 lines
1481 bytes
1481 bytes
boris@raybbs.camelot.de wrote > Hallo zusammen, > ich will im Konstruktor eines globalen Objektes die Kommandozeilenargumente > abfragen, weil diese das Verhalten des globalen Objektes beeinflussen > sollen. > Das Objekt erst in main(...) zu initialisieren ist unguenstig, da mehrere > andere ebenfalls globale Objekte bereits vor main(...) Gebrauch von diesem > bestimmten Objekt machen. [..] > Die Frage ist also: > Wie komm ich auf portable Weise noch vor dem Eintritt in main(...) an die > Kommandozeilenargumente heran? [..] > PS: Literaturhinweise zur Problematik globaler Objekte sind natuerlich auch > sehr willkommen (dann spar ich mir naemlich die naechsten fragen ;-) Gamma et al, "Design Patterns", ISBN 0-201-63361-2 (Addison Wesley) ist extrem empfehlenswert, zwar beschäftigt sich nur ein "Pattern" mit globalen Variablen, aber der Rest ist ebenfalls mehr als wertvoll. Das fragliche Pattern ist "Singleton". Hat man das erstmal, erübrigen sich tatsächlich alle weiteren Fragen in dieser Richtung (zumindest alle, die ich mir momentan vorstellen kann ;-) Olaf -- ln /dev/null /dev/www
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads