次のコードには、特定の C/C++ 基盤が必要な場合があります。
関数ポインターについてある程度の知識が必要です
関数ポインターの詳細な分析についてはここをクリックしてください
common.h
#pragma once typedef int (*pt)(void); void init_2();
#include <iostream> #include "common.h" using namespace std; static pt next_pt; extern pt top_pt; int filter_2() { cout<<"filter_2"<<endl; if(next_pt) next_pt(); } static void filter_2_init() { next_pt = top_pt; top_pt = filter_2; } void init_2() { filter_2_init(); }1.cpp rrreeコンパイルコマンド
g++ 1.cpp 2.cpp -g -O0
実行
./a.out
filter_2
filter_1
すでにプログラムして正常に実行できている場合は、読み続けてください
top_ptはグローバル変数です
。 next_pt はローカル グローバル変数です
知っておいてください
top_pt はコードが実行されるたびに変化し、常に新しいリンク リストの先頭を指します。init_* 関数の継続的な実行により、リンク リストは次のようになります。生成された。これは、グローバル変数で構成される単一リンクのリストのように見えます。
さて、これも奇妙で卑猥なテクニックです、以上です!
上記は、nginx のコンパイル時に生成される関数のリンク リストを、関連する内容も含めて紹介しています。PHP チュートリアルに興味のある友人の参考になれば幸いです。