你好,我正在查看 Linux 内核代码,我在结构中遇到了以下行
unsigned long private[0] ____cacheline_aligned;
它在 struct mmc_host 中定义。它的用法如下:
host = mmc_priv(mmc);
static inline void *mmc_priv(struct mmc_host *host)
{
return (void *)host->private;
}
我无法找到它的初始化位置,因为它不在 mmc_alloc_host() 函数中。
引用以下代码链接。它被定义为 struct mmc_host 中的最后一个变量。
http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/mmc/host.h
最佳答案
这是一个零元素数组,这在 ISO C 中是非法的,但可能是 struct hack 的实现。 .它取决于 gcc 扩展。
____cacheline_aligned
是宏或 gcc 扩展。
创建 struct mmc_host 对象的代码大概可以为这个数组的元素分配额外的空间;成员名称 private
使您可以访问这些元素。
事实上 mcc_alloc_host
函数有一个额外的参数(适本地称为 extra
),它指定要分配多少额外的字节;这些额外的字节构成了 private
数组:
struct mmc_host *mmc_alloc_host(int extra, struct device *dev)
{
...
host = kzalloc(sizeof(struct mmc_host) + extra, GFP_KERNEL);
if (!host)
return NULL;
对该函数的调用可能如下所示:
struct mmc_host *ptr = mmc_alloc(N * sizeof (unsigned long), some_pointer);
关于c - c struct中私有(private)变量的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17931491/