다음 코드에는 특정 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(); }
#include <iostream> #include "common.h" using namespace std; static pt next_pt; pt top_pt; static int filter_1() { cout<<"filter_1"<<endl; if(next_pt) next_pt(); } static void filter_init() { next_pt = top_pt; top_pt = filter_1; } void init_1() { filter_init(); } int main() { init_1(); init_2(); top_pt(); return 0; }
g++ 1.cpp 2.cpp -g -O0
실행
./a.out
filter_2
filter_1
top_pt는 전역 변수입니다
next_pt는 로컬 전역 변수입니다
top_pt는 각각 코드가 실행될 때마다 변경되며, init_* 함수의 지속적인 실행을 통해 지속적으로 새로운 연결 목록의 선두를 가리키게 됩니다. 전역 변수로 구성된 단일 연결 목록처럼 보입니다.
좋아, 또 다른 이상한 기술이야, 그게 다야!
위 내용은 관련 측면을 포함하여 nginx가 컴파일하는 동안 생성한 함수 연결 목록을 소개했으며, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.