Forum: PC-Programmierung C Verständnisfrage


von Beetme (Gast)


Lesenswert?

Halllo,

habe folgenden Ausdruck, den ich nicht ganz interpretieren kann, was 
passiert hier?

CONST(A,B) C={1};

C ist eine Struktur mit mindestens einem Element.

von Rolf M. (rmagnus)


Lesenswert?

Was da passiert, hängt voll und ganz davon ab, wie CONST, A und B 
definiert sind. Vermutlich handelt es sich um irgendwelche Makros. Du 
mußt schauen, in was die aufgelöst werden.

von Karl H. (kbuchegg)


Lesenswert?

Mehr UMgebung.

Was ist 'CONST'?
Was ist 'A'
Was ist 'B'


Auf den ersten Blick sieht es so aus als ob das wohl ein Makro wäre, 
welches aus den Angaben 'A' und 'B' einen (const ?) Datentyp 
zusammenbaut.
Von dem wird dann eine Variable definiert und gleichzeitig 
initialisiert.

Aber: ist nur ein Schuss ins Blaue. Weitere Interpretationen sind 
möglich

von Beetme (Gast)


Lesenswert?

Hallo Rolf,

ja stimmt ist ein Makro, aber so ganz habe ich das noch nicht raus. Gibt 
es eigentlich Tools (IDEs) die einem das Lesen von Makro-Code helfen?

von Karl H. (kbuchegg)


Lesenswert?

Beetme schrieb:
> Hallo Rolf,
>
> ja stimmt ist ein Makro, aber so ganz habe ich das noch nicht raus. Gibt
> es eigentlich Tools (IDEs) die einem das Lesen von Makro-Code helfen?


Such dir das #define für 'CONST'.
So viele werden es ja wohl nicht sein.
Und dann machst du die Textersetzung.

Da steht zb
1
#define CONST(x,y) x struct y

Bei dir steht da im Original
1
CONST(A,B) ....

also ersetzt du den Text 'CONST' durch den Text der in der #define Zeile 
angegeben ist.
GLeichzeitig bindest du beim Makro auch noch den Text 'A' an x und den 
Text 'B' an y. und zwar wegen
1
#define CONST(x,y) ....
Im Ersatztext ersetzt du daher überall dort wo ein 'x' alleine vorkommt 
dieses mit 'A' und überall wo ein 'y' alleine vorkommt, ersetzt du es 
mit 'B'
1
       .... x struct y
2
            ^        ^
3
            |        |
4
            |     hier ersetzt du mit B
5
        und hier ersetzt du mit A


aus
1
CONST (A,B) ....
wird also
1
A struct B ......


(Du setzt natürlich entsprechend dem, was du in deinem Code siehst, ein)

: Bearbeitet durch User
von Tom (Gast)


Lesenswert?

Was die Makrozauberei tut, musst Du selbst im Quellcode herausfinden 
oder den Compiler fragen (bei gcc mit gcc -E meinfile.c -o meinfile.txt 
).



Zur Initialisierung von  structs steht hier das nötigste
https://en.wikipedia.org/wiki/Struct_(C_programming_language)#Struct_initialization

Besonders der Satz
>If an initializer is given [...], omitted elements are initialized to 0.
könnte relevant sein.

von Beetme (Gast)


Lesenswert?

Hallo Karl Heinz,

wenn C eine STruktur-Datentyp ist, wie kann dann daruf der 
Zuweisungsoperator mit geschweiften Klammern folgen?

von Karl H. (kbuchegg)


Lesenswert?

Beetme schrieb:
> Hallo Karl Heinz,
>
> wenn C eine STruktur-Datentyp ist, wie kann dann daruf der
> Zuweisungsoperator mit geschweiften Klammern folgen?


Ehrlich: Lies ein C Buch.
Das steht in jedem noch so grindigem C Buch drinnen.

Du wirst ein Buch brauchen. Seine erste Programmiersprache kann man 
nicht durch Betrachten von fremdem Code lernen. Bei den weiteren gehts 
dann so lala, besonders wenn sie zur selben Sprachfamilie gehören. Aber 
bei der ersten steht man da wie der Ochs vorm Tor. Genau dafür gibt es 
Bücher.

Und ja. Eine Initialisierung solle man erkennen, wenn man eine sieht.

: Bearbeitet durch User
von Bernd K. (prof7bit)


Lesenswert?

Beetme schrieb:
> Gibt
> es eigentlich Tools (IDEs) die einem das Lesen von Makro-Code helfen?

Ja, die meisten vernünftigen IDEs können das. z.B. Eclipse: Da hältst Du 
einfach die Maus 2 Sekunden über das Makro und kannst es dann 
stufenweise expandieren. Oder Du Ctrl-Klickst drauf und springst zu der 
Position an der es deklariert ist.

Und Du kannst die ganze Datei auch durch cpp jagen (mit den selben -D 
und -I optionen wie sie auch für den Compiler verwendet würden) und 
bekommst das Ergebnis des Präprozessors (das was dann der Compiler zu 
sehen bekäme) nach Auflösung aller Makros zu sehen. Das kann manchmal 
auch ganz hilfreich sein um z.B. einen undurchsichtigen Makro-Dschungel 
zu verstehen oder selbst einen solchen zu bauen und zu debuggen.

Oder Du fügst die Option -E in den gcc Compileraufruf ein, dann stoppt 
er nach dem Präprozessor, das hat den selben Effekt.

Siehe hier: 
http://stackoverflow.com/questions/277258/c-c-source-file-after-preprocessing

: Bearbeitet durch User
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.