Heim > Artikel > Backend-Entwicklung > Ähnlich wie bei Nginx wird beim Kompilieren eine funktionsverknüpfte Liste generiert
Der folgende Code erfordert möglicherweise eine bestimmte C/C++-Grundlage.
Erfordert einige Kenntnisse über Funktionszeiger
Klicken Sie hier für eine ausführliche Analyse von Funktionszeigern
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
#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; }Kompilierungsbefehl
g++ 1.cpp 2.cpp -g -O0
execute
./a.out
filter_2
filter_1
falls Sie programmiert haben Und die Ausführung ist erfolgreich, lesen Sie bitte weiter.
top_pt ist eine globale Variable
next_pt ist eine lokale globale Variable
Wenn Sie wissen möchten, was
top_pt befindet sich in jedem. Es ändert sich jedes Mal, wenn der Code ausgeführt wird, und zeigt ständig auf den Kopf der neuen verknüpften Liste. Durch die kontinuierliche Ausführung der Funktion init_* wird eine verknüpfte Liste generiert. Es sieht aus wie eine einfach verknüpfte Liste, die aus globalen Variablen besteht.
Okay, es ist wieder eine seltsame Technik, das ist alles!
Das Obige hat die von Nginx beim Kompilieren generierte verknüpfte Funktionsliste vorgestellt, einschließlich der relevanten Aspekte. Ich hoffe, dass sie für Freunde hilfreich ist, die sich für PHP-Tutorials interessieren.