Forum: Compiler & IDEs .Variable : Was macht der Punkt


von Kaj (Gast)


Lesenswert?

Hallo Leute,

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

So: Was macht der Punkt vor dem Variablennamen? Hat der ne besondere 
Funktion? Wenn ja, welche?

Grüße

von g457 (Gast)


Lesenswert?

gugl gabudd? dasda wär eine gute Anfrage falls es irgendwann mal wieder 
funktioniert: c dot variable

HTH

von Rolf Magnus (Gast)


Lesenswert?

Kaj schrieb:
> So: Was macht der Punkt vor dem Variablennamen?

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?

von Fritz (Gast)


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".

von Marek N. (Gast)


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.

von (prx) A. K. (prx)


Lesenswert?

Marek N. schrieb:
> Vielleicht soll damit eine Art "versteckte" Variable deklariert werden,
> als Gegensatz zu volatile. Damit niemand sieht, ob sich die Variable
> geändert hat.

Hä? So ne Art write-only Variable?

Nö. Das hat er ziemlich frei erfunden aus dem Kontext gerissen und kommt 
in der Initialisierung von Structs vor.

von Johann L. (gjlayde) Benutzerseite


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.

von npn (Gast)


Lesenswert?

Marek N. schrieb:
> Na ja, bei Linux bedeutet doch ein vorangestellter Punkt, dass das man
> das nicht sehen kann.

Du meinst die Namen im Filesystem, dort stimmt das, was du sagst.
Aber hier geht es um C-Quelltext.

von Rolf Magnus (Gast)


Lesenswert?

Johann L. schrieb:
> Ergo: Brill putzen.

Vieleicht ist der Punkt auch nur ein Fliegenschiss auf dem Display. ;-)

von Kaj (Gast)


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.

von Praktiker (Gast)


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

von DirkB (Gast)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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

Ja, die pre-C99-Methode. ;-)  Man führt sie einfach alle der Reihe
nach auf …

von hp-freund (Gast)


Lesenswert?


von MaWin (Gast)


Lesenswert?

Kaj schrieb:
> Ok, auf das struct hatte ich nicht geachtet, mein fehler

Und woher kam das u32 vor dem .Variable ?

Hast du da auch auf was nicht geachtet, auch nein,
dir zusammenphantasiert ?

von Rolf Magnus (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.