Forum: FPGA, VHDL & Co. Xilinx SDK, #define __


von Flo J. (Firma: HS Kempten) (flogzmo)


Lesenswert?

Servus,

die Frage bezieht sich zwar auf C Code aber ich denke in Sachen Xilinx 
Programme bin ich hier richtiger.

In den von den Xilinx Tools automatisch erstellten .c und .h Files 
tauchen viele #defines auf. z.b.
1
#ifdef __PPC__
2
#define CACHEABLE_REGION_MASK 0x80308000
3
#endif

oder
1
#ifndef __PLATFORM_CONFIG_H_
2
#define __PLATFORM_CONFIG_H_

Bedingte defines verstehe ich. Aber was bedeutet __ vor und nach dem 
PPC.

gruß

von Sven P. (Gast)


Lesenswert?

Flo J. schrieb:
> Bedingte defines verstehe ich. Aber was bedeutet __ vor und nach dem
> PPC.
Syntaktisch garnichts.

Viele Leute und Hersteller beginnen und beenden Bezeichner mit '_' oder 
'__', wenn diese intern vordefiniert sind oder nur intern benutzt werden 
sollen. Der Unterstrich zählt als Bestandteil des Bezeichners (quasi ein 
Buchstabe).
1
__PPC__
dürfte z.B. vom Compiler genau dann gesetzt werden, wenn du auf einer 
Powerpc-Architektur kompilierst.
Andere Beispiele sind z.B.
1
__LINE__ und __FILE__
(aktuelle Quelltext-Datei/-Zeile).

von Flo J. (Firma: HS Kempten) (flogzmo)


Lesenswert?

Okay, vielen Dank.

In diesem Zug gleich noch eine Frage :P
1
struct netif {
2
/** pointer to next in linked list */
3
struct netif *next;
4
...
5
/** This function is called by the network device driver
6
*  to pass a packet up the TCP/IP stack. */
7
err_t (* input)(struct pbuf *p, struct netif *inp);
8
...

Dass in einem struct Namens netif wiederum ein Pointer desselben Typs 
netif auftaucht ist mir neu, aber erst recht verstehe ich nicht was in 
der Zeile mit err_t passiert. Funktionsaufruf mit Rückgabewert in einer 
struct Definition?

edit: Und mich stört das Leerzeichen zwischen * und input. Ein Pointer 
sieht für mich so aus: *input

von max (Gast)


Lesenswert?

mmn ist das ein function-pointer. da kannst du dann die 
callback-funktion definieren die aufgerufen wird, sobald ein package 
ankommt.

von Sven P. (Gast)


Lesenswert?

Flo J. schrieb:
>
1
struct netif {
2
> /** pointer to next in linked list */
3
> struct netif *next;
4
> ...
5
> /** This function is called by the network device driver
6
> *  to pass a packet up the TCP/IP stack. */
7
> err_t (* input)(struct pbuf *p, struct netif *inp);
8
> ...
>
> Dass in einem struct Namens netif wiederum ein Pointer desselben Typs
> netif auftaucht ist mir neu,
Das ist eine verkettete Liste. Jede Struktur zeigt einfach auf die 
nächste Struktur in der Liste. Möglich ist das, da Zeiger immer 
diegleiche Größe haben (auf 32-Bit-Systemen meist 4 Bytes), d.h. die 
Sache läuft nicht 'rekursiv', wie man vermuten könnte. Ein Zeiger auf 
ein Byte braucht genauso viel Platz, wie ein Zeiger auf eine riesige 
Datenstruktur.

> aber erst recht verstehe ich nicht was in
> der Zeile mit err_t passiert. Funktionsaufruf mit Rückgabewert in einer
> struct Definition?
Jein, wichtig ist das linke Klammerpaar. Damit wird eine Zeigervariable 
namens 'input' vereinbart. Der Rest drumherum bildet den Zeigertyp, der 
ist hier: Funktion mit zwei Argumenten und Rückgabewert err_t.

Beispiel:
1
int eine_funktion(int a, char b) {
2
  /* ... */
3
}
4
5
int (*zeiger_auf_eine_funktion)(int a, char b);
6
zeiger_auf_eine_funktion = &eine_funktion;

Wobei der Adressoperator ('&') da auch wegfallen darf. Danach bewirken 
folgende Anweisungen dasselbe:
1
int ergebnis;
2
ergebnis = eine_funktion(1, 2);
3
ergebnis = (*zeiger_auf_eine_funktion)(1, 2);
Analog darf auch hier der Verweisoperator ('*') entfallen, es reicht, 
einfach zu schreiben:
1
ergebnis = zeiger_auf_eine_funktion(1, 2);


> edit: Und mich stört das Leerzeichen zwischen * und input. Ein Pointer
> sieht für mich so aus: *input
Leerzeichen, Zeilenumbrüche etc. fallen in C unter 'Leerraum'. Hier ists 
egal, ob und wo ein Leerzeichen steht.

von Flo J. (Firma: HS Kempten) (flogzmo)


Lesenswert?

Daumen Hoch! Danke dir Sven für die ausführliche Erklärung.
Gruß Flo

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.