【nginx分析之c语言篇】
写在前面
因为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的写法一样