Apple Developer Connection
高度な検索
Member Login ログイン | ご入会 ADC連絡先

Technical Q&A QA1429
Deprecated CALL_ON_[UN]LOAD pragmas

Q:CALL_ON_LOADおよびCALL_ON_UNLOADプラグマを使用した、古いプロジェクトをビルドしようとすると、「これらのプラグマは廃止されているため、代わりにコンストラクタの属性とデストラクタの属性を使用する必要があります」と警告されてしまいます。コンストラクタの属性とデストラクタの属性とは何ですか?

A:CALL_ON_LOADとCALL_ON_UNLOADの#pragma行は、アップルのMac OS X 10.0以前のリリースでGCCに追加されました。これらはダイナミックライブラリをロードしたりアンロードしたりするときに呼び出されるルーチンを指定するのに使用されていました。現在では廃止され、コンストラクタとデストラクタの関数属性で置き換えられています。コンストラクタ属性を持った関数はダイナミックライブラリがロードされるときに呼び出されます。同様に、デストラクタ属性を持った関数はダイナミックライブラリがアンロードされるときに呼び出されます。コンストラクタまたはデストラクタ関数が呼び出される際、関数の戻り値は無視され、関数のパラメータは定義されていません。注意:これはコンパイラのみに対する構文変更です。つまりプラグマと属性はバイナリレベルで互換性のあるコードを生成します。

コンストラクタとデストラクタの属性は、バージョン2.5のgccでサポートされています。

リスト1:#pragma行の使用(廃止されています。使用しないでください)

// (廃止されています。使用しないでください。)
#pragma CALL_ON_LOAD my_mod_init_func
static void my_mod_init_func(void)
{
    /* ここで初期化処理を行う */
}

#pragma CALL_ON_UNLOAD my_mod_term_func
static void my_mod_term_func(void)
{
    /* ここで終了処理を行う */
}

リスト2:コンストラクタとデストラクタの属性の使用

void MyInitFunc(void) __attribute__ ((constructor))
{
    /* ここで初期化処理を行う */
}

void MyTermFunc(void) __attribute__ ((destructor))
{
    /* ここで終了処理を行う */
}

注意:このコードをgcc 4.0でビルドすると、属性が関数定義で許可されていないというエラーが出ます。gcc 4.0で関数属性を正しく使用するには、次のように関数を宣言する必要があります。

リスト3:gcc 4.0でのコンストラクタとデストラクタの属性の使用

extern void MyInitFunc(void) __attribute__ ((constructor));
extern void MyTermFunc(void) __attribute__ ((destructor));

void MyInitFunc(void)
{
    /* ここで初期化処理を行う */
}

void MyTermFunc(void)
{
    /* ここで終了処理を行う */
}

ドキュメント改訂履歴

日付メモ
2006-01-10
2005-08-10gcc 4.0の情報を追加
2005-07-05初版

掲載日: 2006-01-10




Did this document help you?
Yes: Tell us what works for you.

It’s good, but: Report typos, inaccuracies, and so forth.

It wasn’t helpful: Tell us what would have helped.