9
votes

Bande bizarre et syntaxe macro dans c

J'ai essayé d'articuler cela dans Google, mais je n'ai rien trouvé d'utile. Voici le code:

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


0 commentaires

4 Réponses :


0
votes

en C L'opérateur [] et * peut traduire dans la même chose lors de la définition. Mais, lors de l'allocation de l'espace, ils ont une syntaxe différente.

Par exemple: A [1] et * (A + 1) sont identiques lorsqu'ils traitent avec une gamme de caractères.


2 commentaires

Ok, mais cela ne répond en aucun cas à la question.


Après avoir regardé les autres réponses, pensez-vous toujours que cela "en aucun cas répond à la question"?



5
votes

Cette syntaxe obscuce est appelée initialisée désignée et vous permet de sauter des éléments lors de la création d'un agrégat de tableau.

Regardez ce programme: P>

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


1 commentaires

Les initialisateurs désignés sont l'une des nouvelles fonctionnalités les plus utiles de C99.



6
votes

Ceci s'appelle un initialisateur désigné . C'est une fonctionnalité C99. Il est utile lorsque la définition des tableaux qui sont principalement nuls, avec certaines valeurs à des indices spécifiques.

Exemples de berceau hors de la page GCC: P>

struct point p = { .y = yvalue, .x = xvalue };


0 commentaires

1
votes

Je pense que cette syntaxe a été introduite en C99, bien que dans une brève enquête sur Google, je ne trouve rien de définitif. En tout état de cause, dans les dialectes C plus anciens, si vous souhaitez initialiser explicitement, par exemple, le 3ème élément d'un tableau, vous devez énumérer explicitement les zéros pour les éléments précédents. C.-à-d., xxx pré>

dans moderne C, vous pouvez saisir cela à la place: p> xxx pré>

la syntaxe est une sorte d'obscure, mais l'intuition, je Pensez, c'est que ce que vous faites est à peu près l'équivalent horaire compilé de: p> xxx pré>

très grossièrement, à nouveau, le code exemple est équivalent à p>

struct Segdesc gdt[(GD_TSS0 >> 3) + 1];
gdt[0] = SEG_NULL;
gdt[GD_KT >> 3] = ...;
...
gdt[GD_TSS0 >> 3 ] = ...;


0 commentaires