c - 标记结构初始化、函数及其参数

标签 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,
};

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

此类初始化的参数何时何地创建?它是在文件的范围内还是在使用结构的范围内。您能否访问参数(例如作为参数传递给 write 函数的指向缓冲区的指针),或者您是否必须以不同的样式初始化结构才能做到这一点?

此外,如果多次调用sample_fops,是否整个文件都是同一个struct?在它的生命周期中,它保存在内存中的什么地方?参数也保存在同一个地方吗?

最佳答案

我没有完全理解你的问题,但这是

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

initializarion .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" );
}

其输出与上图相同。

关于c - 标记结构初始化、函数及其参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57112399/

相关文章:

c++ - 指针运算 : *p++ and (*p)++ and more

c++ - 如何正确编译和链接 C 程序?

c# - 如何在 C# 中将两个结构类型变量链接在一起?

c - 使用 realloc 动态增长结构数组会导致堆损坏

c - Enter E-100E 以太网卡所需的 RTL-8139 驱动程序 - 无法编译源文件

linux - Wind River Linux,失败的依赖错误

c - GMP:初始化多个变量

c - 寻找等于自己个数的因数之和

C# 联合和数组复制

linux - 用于获取物理 RAM 偏移量的内核 API