C言語の__attribute__((constructor))と__attribute__((destructor))の使い方を解説
C言語では、main()関数の実行前に特定の関数を実行したり、main()関数の終了後に別の関数を実行したりすることができます。この機能は、プログラム開始前の初期化処理や、終了後の後始末(クリーンアップ)処理などに活用されます。
__attribute__によるコンストラクタとデストラクタ
この機能を実現するには、GCCが提供する__attribute__()を使用します。対象の関数に対して属性を指定するだけで、実行タイミングを制御できます。
- __attribute__((constructor)): プログラムの起動時、つまり
main()関数が実行される前に、その関数が自動的に呼び出されます。 - __attribute__((destructor)):
main()関数の処理が完了した後に、その関数が自動的に呼び出されます。
なお、これらの属性はGCC固有の拡張機能であるため、移植性を重視するコードでは注意が必要です。
サンプルコード
#include <stdio.h>
void before_main() __attribute__((constructor));
void after_main() __attribute__((destructor));
void before_main() {
printf("This is executed before main.\n");
}
void after_main() {
printf("This is executed after main.");
}
main() {
printf("Inside main\n");
}実行結果
This is executed before main. Inside main This is executed after main.
このように、before_main()はmain()より先に実行され、after_main()はmain()の終了後に実行されていることがわかります。ライブラリの初期化やリソースの解放など、暗黙的に行いたい処理がある場合に非常に便利な機能です。
-
JavaScriptで関数を「関数」として呼び出す方法と「メソッド」として呼び出す方法の違い
JavaScriptでは、同じ関数でも呼び出し方によって「関数としての呼び出し」と「メソッドとしての呼び出し」という2つの使い方ができます。この2つの大きな違いは、関数内でthisが何を参照するかという点にあります。 2つの呼び出し方の違い 関数としての呼び出し:関数名を直接記述して呼び出します(例:add(2, 3))。この場合、thisはグローバルオブジェクト(ブラウザ環境ではwindow)を参照します。 メソッドとしての呼び出し:オブジェクトのプロパティ経由で呼び出します(例:obj.welcome())。この場合、thisはそのオブジェクト自身を参照するため、オブジェクトが持つプロパ
-
JavaScriptの分割代入を使った関数パラメータの受け渡し方法
JavaScriptでは、関数にオブジェクトを引数として渡す際、「分割代入(デストラクチャリング)」と呼ばれる構文を利用することで、オブジェクトの各プロパティを個別の変数として受け取ることができます。 さらに、各プロパティにデフォルト値を指定しておけば、対応するプロパティが存在しない場合でもエラーにならず、あらかじめ設定した値が使用されます。これにより、安全で柔軟な関数設計が可能になります。 サンプルコード 以下は、分割代入を使って関数のパラメータを受け取るJavaScriptのコード例です。 <!DOCTYPE html> <html lang="en&quo