.Variable : Was macht der Punkt

Gast #3689868
Lesenswert?

Kaj schrieb:
> Ich schau mir grad ein bisschen den Linuxkernel an und da ist mir
> folgendes Konstrukt begegnet:
> u32 .Variable = 0;

Nein, das Konstrukt ist dir nicht begegnet.

Wie wärs, wenn du künftig nicht einfach etwas erfindest, was für dich 
irgendwie ähnlich aussiehst, sondern das echte Konstrukt hinschreibst?

Und die Antwort lautet übrigens "designated initializer".
Gast #3689895
Lesenswert?

Na ja, bei Linux bedeutet doch ein vorangestellter Punkt, dass das man 
das nicht sehen kann.
Vielleicht soll damit eine Art "versteckte" Variable deklariert werden, 
als Gegensatz zu volatile. Damit niemand sieht, ob sich die Variable 
geändert hat.
Persönliche Seite #3689906
Lesenswert?

Kaj schrieb:
> Ich schau mir grad ein bisschen den Linuxkernel an und da ist mir
> folgendes Konstrukt begegnet:
>
>
1
u32 .Variable = 0;

Syntaktisch möglich ist das nur als Zugriff auf die Komponente eines 
Structs oder einer Union:
1
struct { unsigned Variable; } u32;
2

3
void f ()
4
{
5
    u32. Variable = 0;
6
}

Im Linuxkernel ist u32 aber kein Komposit sondern analog zu uint32_t von 
C99.

Ergo: Brill putzen.
Gast #3689956
Lesenswert?

Rolf Magnus schrieb:
> So wie du das da hingeschrieben hast, ergibt das für mich keinen Sinn.
> Hast du mal ein Stück Beispielcode, wo das im Kernel so verwendet wird?

zum Beispiel im Kernel 3.15
1
//  /kernel/crypto/crc32.c
2
static struct shash_alg alg = {
3
  .setkey    = crc32_setkey,
4
  .init    = crc32_init,
5
  .update    = crc32_update,
6
  .final    = crc32_final,
7
  .finup    = crc32_finup,
8
  .digest    = crc32_digest,
9
  .descsize  = sizeof(u32),
10
  .digestsize  = CHKSUM_DIGEST_SIZE,
11
  .base    = {
12
    .cra_name    = "crc32",
13
    .cra_driver_name  = "crc32-table",
14
    .cra_priority    = 100,
15
    .cra_blocksize    = CHKSUM_BLOCK_SIZE,
16
    .cra_ctxsize    = sizeof(u32),
17
    .cra_module    = THIS_MODULE,
18
    .cra_init    = crc32_cra_init,
19
  }
20
};
21

22
//  /kernel/crypto/anubis.c
23
static struct crypto_alg anubis_alg = {
24
  .cra_name    =  "anubis",
25
  .cra_flags    =  CRYPTO_ALG_TYPE_CIPHER,
26
  .cra_blocksize    =  ANUBIS_BLOCK_SIZE,
27
  .cra_ctxsize    =  sizeof (struct anubis_ctx),
28
  .cra_alignmask    =  3,
29
  .cra_module    =  THIS_MODULE,
30
  .cra_u      =  { .cipher = {
31
  .cia_min_keysize  =  ANUBIS_MIN_KEY_SIZE,
32
  .cia_max_keysize  =  ANUBIS_MAX_KEY_SIZE,
33
  .cia_setkey    =   anubis_setkey,
34
  .cia_encrypt    =  anubis_encrypt,
35
  .cia_decrypt    =  anubis_decrypt } }
36
};

Ok, auf das struct hatte ich nicht geachtet, mein fehler. Aber nur weil 
es in einem struct steht, erschließt sich für mich noch nicht 
automatisch das es etwas struct spezifisches ist.

Danke für eure hilfe.
Gast #3690021
Lesenswert?

Kaj schrieb:
> Aber nur weil es in einem struct steht, erschließt sich für mich noch
> nicht automatisch das es etwas struct spezifisches ist.

Kennst du eine andere, kurze Möglichkeit um ELemente aus einem struct 
anzusprechen?

Syntax muss man manchmal so hinnehmen, wie sie definiert ist ;-)
Gast #3690033
Lesenswert?

Kaj schrieb:
> Ok, auf das struct hatte ich nicht geachtet, mein fehler. Aber nur weil
> es in einem struct steht, erschließt sich für mich noch nicht
> automatisch das es etwas struct spezifisches ist.

Ein Punkt hat mit einer struct ja so gar nichts zu tun.
Gast #3690280
Lesenswert?

Wenn's um eine Variablendefinition geht (ob nun struct oder nicht), dann 
sollte man sich die immer ganz anschauen und nicht nur einen kleinen aus 
dem Kontext gerissenen Ausschnitt davon - und den dann noch falsch 
wiedergeben.
Naja, egal. Es handelt sich, wie andere schon vermutet haben, um die mit 
C99 eingeführte Möglichkeit, struct-Elemente explizit per Namen zu 
initialisieren.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren