c中的奇怪的括号和宏语法

我试图把这个表达到谷歌,但没有找到任何有用的描述它.以下是代码
struct Segdesc gdt[] =
{
  // 0x0 - unused (always faults -- for trapping NULL far pointers)
  SEG_NULL,// 0x8 - kernel code segment
  [GD_KT >> 3] = SEG(STA_X | STA_R,0x0,0xffffffff,0),// 0x10 - kernel data segment
  [GD_KD >> 3] = SEG(STA_W,// 0x18 - user code segment
  [GD_UT >> 3] = SEG(STA_X | STA_R,3),// 0x20 - user data segment
  [GD_UD >> 3] = SEG(STA_W,// 0x28 - tss,initialized in trap_init_percpu()
  [GD_TSS0 >> 3] = SEG_NULL
};

有人可以解释有没有数组或指针前面的括号的含义吗?

解决方法

这种模糊的语法被称为指定的初始化程序,它允许您在创建数组聚合时跳过元素.

看看这个程序:

#include <stdio.h>
int a[] = {
    1,[2]=3,[5]=7
};
int main() {
    int i;
    for(i=0;i!=sizeof(a)/sizeof(int);i++)
        printf("a[%d] = %d\n",i,a[i]);
    return 0;
}

它使用相同的语法来跳过数组a的元素1,3和4.

这是程序打印的:

a[0] = 1
a[1] = 0
a[2] = 3
a[3] = 0
a[4] = 0
a[5] = 7

您的程序执行相同的操作,但是会初始化一个结构数组,并使用编译时常量的位移将索引计算到其数组聚合中.您可以在注释(0x08,0x10,0x18,0x20和0x28)中找到这些索引的值.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...