Forum: Mikrocontroller und Digitale Elektronik Bitte um Hilfe bei einem unverständlichen C-Code Abschnitt


von noips (Gast)


Lesenswert?

Hallo an alle!

Ich komme mit dem folgenden Code nicht klar. Ich habe nicht relativ 
wenig Erfahrung mit C.

1
#ifdef SPC3_FLAT
2
  #define SPC3_PTR_ATTR
3
#else
4
  #define SPC3_PTR_ATTR FAR
5
#endif
6
7
typedef unsigned char SPC3_PTR_ATTR * SPC3_PTR;

Habe mich jetzt mit den Präprozessor-Anweisungen bekannt gemacht und 
meine den oberen Abschnitt zu verstehen. Nicht klar ist mir die 
Typdefinition-Zeile unten. Wenn dieses "SPC3_PTR_ATTR" aus der 
define-Anweisung weiter oben nicht da wäre, so würde ich sagen, hier 
wird ein Typ namens "SPC3_PTR" definiert, der ein Zeiger auf ein 
unsigned char ist. Aber so wie es da steht, ist es mir ganz unklar. Ein 
erfahrenen C-Programmiere sieht hier evtl. gleich, was Sache ist. Darum 
möchte ich euch mal um Hilfe bitte.

Besten Dank im Voraus!!!!

von noips (Gast)


Lesenswert?

Korrektur:

Wollte schreiben: Ich habe relativ wenig Erfahrung in C.

von Peter D. (peda)


Lesenswert?

Wenn nichts hinter dem Define steht, wird es eben durch nichts ersetzt.
Der Ausdruck expandiert also zu:
1
typedef unsigned char* SPC3_PTR;
oder
1
typedef unsigned char FAR* SPC3_PTR;


Peter

von Karl H. (kbuchegg)


Lesenswert?

noips schrieb:

> define-Anweisung weiter oben nicht da wäre, so würde ich sagen, hier
> wird ein Typ namens "SPC3_PTR" definiert, der ein Zeiger auf ein
> unsigned char ist.

Soweit gut analysiert.

> Aber so wie es da steht, ist es mir ganz unklar.

Ist zusätzlich das Makro SPC3_FLAT definiert (sowas wird meistens 
Projektweit zb beim Aufruf des Compilers definiert), dann wird jedes 
vorkommen des Textes SPC3_PTR_ATTR durch nichts (ein Leerzeichen) 
ersetzt. Ist hingegen SPC3_FLAT nicht definiert, so wird selbiges 
SPC3_PTR_ATTR durch den Text FAR ersetzt.

Zusammengenommen läuft es also darauf hinaus:
Ist beim das Makro SPC3_FLAT nicht vorhanden, so wird der Datentyp 
SPC3_PTR als typedef

typedef unsigned char FAR * SPC3_PTR;

ist hingegen SPC3_FLAT definiert, so lautet der typedef

typedef unsigned char * SPC3_PTR;

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Wenn SPC3_FLAT nicht definiert ist, dann

  typedef unsigned char * SPC3_PTR;

andernfalls

  typedef unsigned char FAR * SPC3_PTR;


FAR dürfte hier eine compilerspezifische Erweiterung sein, die Pointer 
mit größeren Adressräumen als dem üblichen zulässt; das ist auf 
Architekturen mit Segmentierung wie (16-Bit) x86 und manchen PICs eine 
übliche Vorgehensweise.

von Oliver (Gast)


Lesenswert?

Spiel doch einfach selber Preprozessor, und schreib hin, was in beiden 
Fällen rauskommt.

SPC3_FLAT ist definiert: SPC3_PTR_ATTR wird durch  (sprich: nix) 
ersetzt:
1
typedef unsigned char * SPC3_PTR;

SPC3_FLAT ist nicht definiert: SPC3_PTR_ATTR wird durch FAR ersetzt:
1
typedef unsigned char FAR * SPC3_PTR;

Oliver

von noips (Gast)


Lesenswert?

B E S T E N  D A N K  an euch alle!!!

>FAR dürfte hier eine compilerspezifische Erweiterung sein, die Pointer
>mit größeren Adressräumen als dem üblichen zulässt; das ist auf
>Architekturen mit Segmentierung wie (16-Bit) x86 und manchen PICs eine
>übliche Vorgehensweise.

Also wenn FAR wirklich nur so eine Erweiterung ist, die Pointer mit 
größeren Adressräumen zulässt, dann kann ich ja (einfach zum Verstehen 
des Codes) mir diese ja auch "wegdenken" und davon ausgehen, dass 
"SPC3_PTR"  einfach ein Zeiger auf ein unsigned char ist, oder?

von Karl H. (kbuchegg)


Lesenswert?

noips schrieb:

> Also wenn FAR wirklich nur so eine Erweiterung ist, die Pointer mit
> größeren Adressräumen zulässt, dann kann ich ja (einfach zum Verstehen
> des Codes) mir diese ja auch "wegdenken" und davon ausgehen, dass
> "SPC3_PTR"  einfach ein Zeiger auf ein unsigned char ist, oder?

Ja.
Dabei handelt es sich einfach nur um eine technische Notwendigkeit auf 
manchen Architekturen. Logisch gesehen ist das irrelevant (auch wenn es 
furchtbar kracht, wenn man da einen Fehler macht).

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.