11

共有ライブラリのロード時にコードを呼び出すコードを作成したいと思います。私はこのようにそれをするだろうと思った:

#pragma init(my_init)

static void my_init () {  
  //do-something
}

int add (int a,int b) {  
  return a+b; 
}

だから私がそのコードを構築するとき

gcc -fPIC -g -c -Wall tt.c

戻ります

gcc -fPIC -g -c -Wall tt.c 
tt.c:2: warning: ignoring #pragma init 
tt.c:4: warning: ‘my_init’ defined but not used

したがって、私の#pragmasを無視します。これを実際のコードで試しましたが、プラグマセクションで関数が無視されたために呼び出されなかったため、コードが中止されました。

gccでこれらの#pragmainitおよびfiniステートメントを使用するにはどうすればよいですか?

4

3 に答える 3

17

プラグマはほとんどすべてコンパイラ固有です。GCCは実装していませんが、 function属性initを使用して同じ効果を得ることができます。constructor

static __attribute__((constructor)) void my_init()
{  
  //do-something
}

destructor対応する属性もあります。

于 2010-03-17T04:21:23.807 に答える
3

どうやら#pragma init、 GCCforSolarisで#pragma finiのみサポートされています。

于 2010-03-17T04:27:32.730 に答える
-3

代わりに、C++を使用してください。

// init.cpp
名前空間//匿名の名前空間
{{
     クラスautoinit
     {{
         公衆:
             〜autoinit(){/*該当する場合は破棄コード*/}
         プライベート:
             autoinit(){/*myinitの内容*/}
             static autoinit _instance;
     };

     autoinit
     autoinit :: _ instance; //静的インスタンスは静的構築を強制します
}
于 2010-03-17T04:36:08.257 に答える