const struct file_operations generic_ro_fops = {
.llseek = generic_file_llseek,
.read = do_sync_read,
// ....other stuffs
};
我的问题是:
1).llseek
的含义是什么以及如何使用.
... file_operations结构定义如下:
2)我可以在上面的结构中说:llseek = generic_file_llseek ;
,让指针llseek
指向generic_file_llseek
而不将.
放在llseek
之前?
//对不起我的英语很差
struct file_operations {
loff_t (*llseek) (struct file *, loff_t, int);
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
//....other stuffs
}
答案 0 :(得分:2)
这是c99中引入的特殊结构初始化语法。
如果在结构初始值设定项中有.llseek = generic_file_llseek,
,则表示您正在初始化此特定成员,而不管其相对于结构开始的偏移量。
或者你可以使用没有指示符的初始化,但是当声明结构中的相应字段时,你必须按照确切的顺序放置初始化器。
const struct file_operations generic_ro_fops = {
generic_file_llseek, // this initializes llseek member
do_sync_read, // this initializes read member
// ....other stuffs
};
答案 1 :(得分:1)
这称为指定初始值设定项。您正在初始化结构的确切成员/字段。
2.我只想说:“llseek = generic_file_llseek;”在上面的结构中让指针llseek指向generic_file_llseek而不是 点'''。在llseek之前?
没有
您可以执行以下操作来初始化成员:
const struct file_operations generic_ro_fops = {
generic_file_llseek,
do_sync_read,
// ....other stuffs
};
但在这种情况下,您必须按顺序初始化所有内容,就像将成员放在结构中一样。当您只想初始化一些结构字段时,指定的初始值设定项非常有用。
你可以在外部结构中使用这样的东西:
generic_ro_fops.llseek = generic_file_llseek;
答案 2 :(得分:0)
1).llseek的含义是什么以及如何使用.... file_operations结构定义如下:
这是C99功能:指定的初始值设定项。使用.
,您可以初始化结构的给定字段。在这里,有必要初始化const
限定符的结构原因。
如果lseek
和read
在结构定义中按此顺序排列,则可以省略此指示符。
const struct file_operations generic_ro_fops = {
generic_file_llseek,
do_sync_read
};
这最后一个方法不是很可维护(如果你改变结构字段的顺序,你必须改变所有的初始化代码),因此这里使用指定的iniitializers的方法更好。
2)我可以这样说:llseek = generic_file_llseek;在上面的结构中,让指针llseek指向generic_file_llseek而不放置点。在llseek之前? //对不起我的英语很差
不,你不能,因为它不是正确的语法。
C11(n1570),§6.7.9初始化
如果指定人员的表格为
. identifier
然后当前对象(下面定义)应具有结构或联合 type和标识符应该是该类型成员的名称。
答案 3 :(得分:0)
'。'的含义在该结构中称为designated initializer。在结构中,每个'。'表示需要初始化的结构的成员,因此被称为指示符。