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?
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".
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.
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.
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.
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
staticstructshash_algalg={
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
staticstructcrypto_alganubis_alg={
24
.cra_name="anubis",
25
.cra_flags=CRYPTO_ALG_TYPE_CIPHER,
26
.cra_blocksize=ANUBIS_BLOCK_SIZE,
27
.cra_ctxsize=sizeof(structanubis_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.
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 ;-)
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.
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 …
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 ?
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.