c中奇怪的括号和宏语法

Rob*_*obz 9 c arrays macros pointers

我试图将其表达为谷歌,但未能找到任何有用的描述它.这是代码:

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, 0x0, 0xffffffff, 0),

  // 0x18 - user code segment
  [GD_UT >> 3] = SEG(STA_X | STA_R, 0x0, 0xffffffff, 3),

  // 0x20 - user data segment
  [GD_UD >> 3] = SEG(STA_W, 0x0, 0xffffffff, 3),

  // 0x28 - tss, initialized in trap_init_percpu()
  [GD_TSS0 >> 3] = SEG_NULL
};
Run Code Online (Sandbox Code Playgroud)

有人可以解释在没有数组或指针的情况下拥有括号的含义吗?

Joh*_*eek 6

这称为指定初始化程序.这是一个C99功能.在定义大多数为零的数组时,它很有用,在特定索引处有一些值.

GCC页面上的示例:

int a[6] = { [4] = 29, [2] = 15 };
Run Code Online (Sandbox Code Playgroud)

相当于

int a[6] = { 0, 0, 15, 0, 29, 0 };
Run Code Online (Sandbox Code Playgroud)

"指定初始化程序"也指以类似方式初始化结构的能力:

struct point p = { .y = yvalue, .x = xvalue };
Run Code Online (Sandbox Code Playgroud)


das*_*ght 5

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

看看这个程序:

#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;
}
Run Code Online (Sandbox Code Playgroud)

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

这是该程序打印的内容:

a[0] = 1
a[1] = 0
a[2] = 3
a[3] = 0
a[4] = 0
a[5] = 7
Run Code Online (Sandbox Code Playgroud)

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