标记的结构初始化,函数及其参数

时间:2019-07-19 12:20:22

标签: c struct linux-kernel initialization

许多内核模块似乎选择了以下结构初始化样式;

struct file_operations sample_fops = {
.owner = THIS_MODULE,
.read = sample_read,
.write = sample_write,
.ioctl = sample_ioctl,
.open = sample_open,
.release = sample_release,
};

当这种样式用于基元和指针数据类型时,我可以全神贯注,但是我无法弄清楚它们如何对函数如此无缝地工作。

何时以及在何处创建此类初始化的参数?是在文件范围内还是在使用该结构的范围内。您可以访问参数(例如,指向作为写函数的参数传递的缓冲区的指针)还是必须以其他方式初始化结构才能做到这一点?

此外,如果多次调用sample_fops,整个文件中的结构是否相同?在生命周期中将其保存在内存中的什么位置?这些参数也保存在同一位置吗?

2 个答案:

答案 0 :(得分:2)

我不确定您的问题,但这是

struct file_operations sample_fops = {
.owner = THIS_MODULE,
.read = sample_read,
.write = sample_write,
.ioctl = sample_ioctl,
.open = sample_open,
.release = sample_release,
};

类型为sample_fops的对象struct file_operations的声明。

似乎该结构的数据成员被声明为指向函数的指针,并且在此声明中,函数指示符例如sample_open用于初始化该结构的相应数据成员。

这是一个演示程序。

#include <stdio.h>

void f( void )
{
    puts( "Hello Yusuf Gürkan Bor" );
}

struct A
{
    void ( *hello )( void );    
};

int main( void )
{
    struct A a = { .hello = f };

    a.hello();
}

程序输出为

Hello Yusuf Gürkan Bor

初始化.fp = f中的该记录称为指定初始化。 它使用已初始化结构的数据成员的名称。

实际上,您可以等效地写

struct A a = { f };

但是对于这样的初始化,您必须相对于数据成员的顺序保持初始化程序的顺序。

这是函数接受参数的另一个示例。

#include <stdio.h>

void f( const char *name )
{
    printf( "Hello %s\n", name );
}

struct A
{
    void ( *hello )( const char * );    
};

int main( void )
{
    struct A a = { .hello = f };

    a.hello( "Yusuf Gürkan Bor" );
}

其输出与上面显示的相同。

答案 1 :(得分:0)

以下代码段:

int main ()
{
    typedef struct ArrayType
    {
        int field1;
        int field2;
    };

    struct ArrayType myArray =
    {
        .field1 = 0,
        .field2 = 1,
    };
}

等同于

int main ()
{
    typedef struct ArrayType
    {
        int field1;
        int field2;
    };

    ArrayType myArray;
    myArray.field1 = 0;
    myArray.field2 = 1;
}

如果您有一个指向函数的指针,那么它也可以工作。

int function1(int a,int b){ return a+b};
void function2(int c) {};

int main ()
{
    typedef struct ArrayType
    {   
        int(*function1)(int,int);
        void(*function2)(int);
    };

    ArrayType myArray;
    myArray.function1= thisFunction;
    myArray.function2= thatFunction;
}