下面代码可能须要一定的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

#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 编译时生成函数链表的更多相关文章

  1. Nginx 编译设置模块执行顺序

    Nginx编译时,配置"--add-module=xxx"可以加入模块,当我们需要按照指定顺序来设置过滤模块执行顺序时,先配置的"--add-module=xxx&quo ...

  2. nginx增加ssl支持 - 编译时参数详情列表

    ./configure \ --with-http_ssl_module \ make && make install     nginx编译参数说明如下:   --prefix=&l ...

  3. 获取安装后Apache、MySQL、Nginx、PHP编译时参数

    # cat /usr/local/apache2/build/config.nice      //获取Apache编译时的参数 #!/bin/sh # #Created by configure & ...

  4. nginx编译模块详解

    –prefix= 指向安装目录–sbin-path 指向(执行)程序文件(nginx)–conf-path= 指向配置文件(nginx.conf)–error-log-path= 指向错误日志目录–p ...

  5. nginx 编译增加新的模块

    原已经安装好的nginx,现在需要添加一个未被编译安装的模块: nginx -V 可以查看原来编译时都带了哪些参数 原来的参数:--prefix=/app/nginx 添加的参数: --with-ht ...

  6. Nginx编译安装lua-nginx-module

    lua-nginx-module 模块可以将Lua的强大功能嵌入NGINX服务器. 下载Nginx源码 如果已安装Nginx,需要查看当前安装版本的编译参数: $ /usr/local/nginx/s ...

  7. nginx编译安装on mac

    一.编译安装模块 如果是原有包中就有的模块,编译时, ./configure --with-xxx 就可以, 如果是第三方模块,可使用 --add-module, 如果有多个模块的话,只需要多次使用- ...

  8. [nginx]编译安装及安全优化

    nginx配置-最后整理版 nginx_upstream_check_module nginx-module-vts nginx打补丁 nginx编译安装 - 下载 cd /usr/local/src ...

  9. Linux下nginx编译安装教程和编译参数详解

    这篇文章主要介绍了Linux下nginx编译安装教程和编译参数详解,需要的朋友可以参考下 一.必要软件准备1.安装pcre 为了支持rewrite功能,我们需要安装pcre 复制代码代码如下: # y ...

随机推荐

  1. .sh文件 编写格式

    http://blog.sina.com.cn/s/blog_54f82cc201010hfz.html 介绍: 1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号# ...

  2. SpringBoot + MyBatis(注解版),常用的SQL方法

    一.新建项目及配置 1.1 新建一个SpringBoot项目,并在pom.xml下加入以下代码 <dependency> <groupId>org.mybatis.spring ...

  3. ROS-URDF-建立模型

    前言:建立一个简单的urdf模型 详解请参看教程http://wiki.ros.org/urdf/Tutorials/Building%20a%20Visual%20Robot%20Model%20w ...

  4. B - Is your horseshoe on the other hoof?

    Problem description Valera the Horse is going to the party with friends. He has been following the f ...

  5. 5.20 mybatis反向生成的映射文件xml(如果需要自己定义其他sql语句时如下)

    解决mybatis-generator 生成的mapper.xml覆盖自定义sql的问题 mybatis-generator是个好工具,一建即可生成基本增删改成功能的mapper.xml.但这些是不够 ...

  6. 努比亚(nubia) V18 NX612J 解锁BootLoader 并刷入recovery ROOT

    recovery制作来自绯色玻璃 努比亚(nubia) V18 NX612J 解锁BootLoader 并刷入recovery ROOT 工具下载链接:https://pan.baidu.com/s/ ...

  7. End to End Sequence Labeling via Bi-directional LSTM CNNs CRF

    来看看今日头条首席科学家的论文: End-to-end Sequence Labeling via Bi-directional LSTM-CNNs-CRF 使用LSTM方法进行序列标注,完成大规模标 ...

  8. python自动发邮件库yagmail(转)

    一般发邮件方法 我以前在通过Python实现自动化邮件功能的时候是这样的: import smtplib from email.mime.text import MIMEText from email ...

  9. java源码

    Java泛型中的标记符含义: K - Key(键) V - Value(值) E - Element (在集合中使用,因为集合中存放的是元素) T - Type(Java 类,可做泛型) N - Nu ...

  10. select和epoll最大的区别

    先说说阻塞,因为一个线程只能处理一个套接字的I/O事件,如果想同时处理多个,可以利用非阻塞忙轮询的方式,伪代码如下: while true { for i in stream[] { if i has ...