Path: chuka.playstation.co.uk!news1.scei.co.jp!usenet From: "Yama" Newsgroups: playstation.ny.program.labo Subject: =?ISO-2022-JP?B?UmU6IEdDQysrGyRCJE49aTR8Mj0kRCQkJEYbKEo=?= Date: 24 Apr 1997 02:51:16 GMT Organization: =?ISO-2022-JP?B?SUJNIGV0Yw==?= Lines: 90 Message-ID: <01bc5059$ac5515e0$9d36d4ca@pbc00426.niftyserve.or.jp> References: <01bc4ff3$89f95f80$5410dbca@default> NNTP-Posting-Host: 202.212.54.157 Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 8bit X-Newsreader: Microsoft Internet News 4.70.1157 こんにちは、やま です。 > 突然ですが GNU C++ について教えてください。 > 現在このコンパイラを使用してオリジナルのクラスライブラリを作成中なので すが > 、静的変数の初期化ができなくて、詰まっています。 すみません、 私がアップロードした go32版gcc では、 グローバル変数については、コンストラクタ が呼ばれていませんでした。 使ってくれる人が増えてくると、いろいろ 不具合が露見して、 冷や汗ものです。 実は、exception も未対応だったりします。(^^; 本来は、スタートアップルーチン内で、 (a) 各グローバル変数について コンストラクタを 呼び出す。 (b) 終了時に それら変数について デストラクタが呼ばれる様に登録(atexit)。 と すべきなのですが、 とりあえず、以下の手順で回避してみてください。 (1) 関数 __do_global_ctors と __do_global_dtors を定義する。 (ソースは、以下のサンプルを参照。) (2) main の 最初と最後 で、それぞれ、 __do_global_ctors と __do_global_dtors をコール。 以下は、サンプルです。 #include // global変数の destructor を呼び出す。 void __do_global_dtors() { extern void (*(__DTOR_LIST__[])) (void); void (**p)(void); for ( p = __DTOR_LIST__ + 1 ; *p ; ) (*p++) (); } // __do_global_dtors // global変数の constructor を呼び出す。 void __do_global_ctors() { extern void (*(__CTOR_LIST__[])) (void); do { unsigned long nptrs = (unsigned long) __CTOR_LIST__[0]; unsigned i; if ( nptrs == -1 ) for (nptrs = 0; __CTOR_LIST__[nptrs + 1] != 0; nptrs++); for (i = nptrs; i >= 1; i--) __CTOR_LIST__[i] (); } while (0); //atexit( __do_global_dtors ); // atexit がないので 省略 } // __do_global_ctors class test { public: long b; long c; test( int i = 0, int j = 0) : b( i ), c( j ) { printf( "ctor( %d, %d )¥n", b, c ); }; ‾test() { printf( "dtor( %d, %d )¥n", b, c ); }; }; // test test g_b1( 10,100 ); test g_b2( 20,200 ); void sub( test const& t ) { printf( "test=(%d %d)¥n", t.b, t.c ); } void main() { __do_global_ctors(); sub( g_b1 ); sub( g_b2 ); __do_global_dtors(); }