1

可能重复:
结构中变量名前的点是什么意思?

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
}
4

4 回答 4

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
};
于 2012-10-24T15:07:59.840 回答
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;
于 2012-10-24T15:07:14.070 回答
0

意义

1) .llseek 是什么意思以及如何使用....file_operations 结构体定义如下:

这是一个 C99 特性:指定初始化程序。使用 ,.您可以初始化结构的给定字段。在这里,有必要初始化const限定符的结构原因。

如果lseekread在结构定义中按此顺序排列,则可以省略此指示符。

const struct file_operations generic_ro_fops = { 
    generic_file_llseek, 
    do_sync_read 
};

最后一种方法不太易于维护(如果更改结构字段的顺序,则必须更改所有初始化代码),因此这里使用指定初始化器的方法更好。

其他方式

2)我可以说:llseek = generic_file_llseek;在上面的结构中让指针 llseek 指向 generic_file_llseek 而不放置点。在 llseek 之前?//对不起我糟糕的英语

不,你不能,因为它不是正确的语法。

参考

C11 (n1570),第 6.7.9 节初始化

如果指定人具有以下形式

. identifier

那么当前对象(定义如下)应具有结构或联合类型,标识符应为该类型成员的名称。

于 2012-10-24T15:07:25.830 回答
0

'.' 的含义 在该结构中称为指定初始化程序。在结构中,每个 '.' 表示需要初始化的结构成员,因此称为指示符。

于 2012-10-24T15:08:12.647 回答