Ähnlich wie bei Nginx wird beim Kompilieren eine funktionsverknüpfte Liste generiert

WBOY
Freigeben: 2016-08-08 09:22:18
Original
1225 Leute haben es durchsucht

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();
Nach dem Login kopieren

2 .cpp
#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();
}
Nach dem Login kopieren
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;
}
Nach dem Login kopieren
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.

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage