🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: de.comp.lang.c++
5 messages
5 total messages Started by Boris Lohner Sat, 25 Nov 1995 01:07
Kommandozeilenargumente bevor main()
#870
Author: Boris Lohner
Date: Sat, 25 Nov 1995 01:07
37 lines
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()
#873
Author: Ralf W. Stephan
Date: Sat, 25 Nov 1995 09:08
37 lines
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()
#878
Author: Ullrich von Bassewitz
Date: Sat, 25 Nov 1995 13:17
35 lines
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()
#886
Author: Karl-Heinz Krause
Date: Sat, 25 Nov 1995 16:42
37 lines
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()
#900
Author: Olaf Kock
Date: Sun, 26 Nov 1995 00:00
27 lines
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