ホームページ  >  記事  >  バックエンド開発  >  nginxと同様に、コンパイル時に関数リンクリストが生成されます。

nginxと同様に、コンパイル時に関数リンクリストが生成されます。

WBOY
WBOYオリジナル
2016-08-08 09:22:181213ブラウズ

次のコードには、特定の C/C++ 基盤が必要な場合があります。

関数ポインターについてある程度の知識が必要です

関数ポインターの詳細な分析についてはここをクリックしてください

common.h

#pragma once
typedef int (*pt)(void);
void init_2();

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();
}
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 チュートリアルに興味のある友人の参考になれば幸いです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。