标记结构初始化、函数及其参数
Tagged structure initialization, functions and their parameters
许多内核模块似乎选择了以下结构初始化样式;
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,
};
类型为 struct file_operations
的对象 sample_fops
的声明。
似乎结构的数据成员被声明为指向函数的指针,并且在此声明中函数指示符例如 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" );
}
其输出与上图相同
以下片段:
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;
}
许多内核模块似乎选择了以下结构初始化样式;
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,
};
类型为 struct file_operations
的对象 sample_fops
的声明。
似乎结构的数据成员被声明为指向函数的指针,并且在此声明中函数指示符例如 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" );
}
其输出与上图相同
以下片段:
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;
}