写在前面

因为nginx的很多语法可能很多不常见,因此在这边做个记录或者简单的交流,

struct中字段位宽

在nginx源码中,我们常看到这样的代码:
在这里插入图片描述

就是在结构体后面的字段名称加上了:1这样,其实后面加上冒号数字,代表的是这个字段占据了几个位,:1代表了只占一个位,因为这个字段为1或者0,相比于int类型,可以起到省类型的作用。接下来我们写个简单的例子:
在这里插入图片描述

在这里我们声明了一个bitA的结构体,并且指定a为1个位宽,在等于1的时候就是1,接下来我们声明成2和3试试,
在这里插入图片描述

可以看到因为2在二进制中是10,超过了一个位宽,所在在编辑的时候给了告警,然后运行的时候,结果是0.这个是因为2的第一个位是0.

结构体中带方法名

就是结构中中带上了方法名称
在这里插入图片描述

这边我们来写一个自己的示例:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

typedef int (*Operation)(int a, int b);


struct testFunc {
    int a;
    int (*init_master)(int *b);
    int *(*init_process)(int *b);
    Operation add;
};

//a和b相加
int Add (int a, int b){
    return a + b ;
}


int init_master(int *b){
    return *b;
}

int* init_process(int *b){
    *b = *b+1;
    return b;
}



int main(int argc, char const *argv[])
{
    struct testFunc testFunc1;
    testFunc1.init_master = init_master;
    testFunc1.init_process = &init_process;
    testFunc1.add = Add;

    int a = 1;
    int b;
    b = testFunc1.init_master(&a);
    printf("b:%d\n",b); //1


    int c = 2;
    int *d;
    d = testFunc1.init_process(&c);
    printf("d:%d\n",*d); //3


    int e;
    e = testFunc1.add(a,b);
    printf("e:%d\n",e); //2


    return 0;
}

我们简单分析一下testFunc这个结构体,这个结构体申明了4个变量,

  • 分别是 a
  • 名称为init_master方法名称,返回值为int,
  • 名称为 init_process 的指针,返回值为int,所以我们后面接上的取地址符号
  • 和一个名字为add,类型为Operation的方法,定义为typedef int (*Operation)(int a, int b);作用和init_master的写法一样
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐