Xilinx SDK, #define __

OP (Firma: HS Kempten) #1702569
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ß
Gast #1702572
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).
OP (Firma: HS Kempten) #1702599
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
Gast #1702692
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.

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