Was macht dieses define in C?

Gast #5667445
Hallo,

in einer library von NXP habe ich folgendes Define gefunden:
1
#define ROM_API_BASE_LOC    0x03000200UL
2
#define ROM_API     (*(ROM_API_T * *) ROM_API_BASE_LOC)

Ich verstehe nicht so ganz, was das macht. die zwei "* *" verwirren mich 
dabei. Ist das ein doppelter Pointer?
Kann mir jemand ein bisschen erklären, wohin ROM_API nun zeigt?

Vielen Dank!
Gast
Hallo,
hast Du dir mal die Definition angesehen?
1
typedef struct ROM_API {
2
  162  const uint32_t    unused[2];
3
  163  const CCAN_API_T  *pCCAND; 
4
  164 } ROM_API_T;

Quellen:
[1] http://67.222.144.123/lpcopen/v1.03/struct_r_o_m___a_p_i___t.html
[2] http://67.222.144.123/lpcopen/v1.03/ccand__11xx_8h_source.html

Dann ist die innere Klammer ein Cast auf (ROM_API_T  ), diese wird 
durch das *(...) wird die Adresse ROM_API_BASE_LOC von Datentype Pointer 
auf ROM_API_T.
Gast
ROM_API_BASE_LOC wird als Zeiger interpretiert und mit * vor den 
Klammern auf den dort hinterlegten Wert zugegriffen. Diesen Wert gibt 
ROM_API aus.

(ROM_API_T  ) ist ein Zeiger auf einen Zeiger. Was ROM_API_T kann ich 
dir nicht sagen.
Georg schrieb:
> #define ROM_API_BASE_LOC    0x03000200UL
> #define ROM_API     (*(ROM_API_T  ) ROM_API_BASE_LOC)

ROM_API_BASE_LOC ist ein unsigned long Literal, das hiermit
1
(ROM_API_T * *) ROM_API_BASE_LOC
als Zeiger auf einen Zeiger auf ein Objekt vom Typ ROM_API_T 
(wahrscheinlich ein struct?) gecasted wird.

Damit
1
(*(ROM_API_T * *) ROM_API_BASE_LOC)
 wird dieser Zeiger dereferenziert - d.h. ROM_API ist nun ein Zeiger auf 
ein ROM_API_T.

Damit kannst Du mit den Elementen von ROM_API direkt über den -> 
Operator hantieren.
Gast
>> Ahh...ich liebe C++ ...ein wenig das Gehirn quälen  :-)
> Wie wahr (und das sagt einer der seine Bachelor Thesis mit C++ Projekt
> geschrieben hat)...

Wer vor Pointern Angst hat, sollte um Low-Level-Programmierung und C/C++ 
nen ganz großen Bogen machen!

> [...] nur man sollte es nicht wie hier übertreiben.

Ernsthaft? Einfacher geht es doch gar nicht. Wie würdest du denn den 
Zugriff auf eine Struktur machen, dessen Adresse in 0x3000200 steht?
Persönliche Seite
Hmm schrieb:
> Ahh...ich liebe C++ ...ein wenig das Gehirn quälen  :-)

Nur ist das eher C-Stil... In C++ kann man das sauberer so machen:
1
static constexpr std::uintptr_t ROM_API_BASE_LOC = 0x03000200UL;
2
static ROM_API_T* const ROM_API = *reinterpret_cast<ROM_API_T**> (ROM_API_BASE_LOC);

Alex G. schrieb:
> Andererseits gabs Gelegenheiten wo Makros auch in Java ganz nützlich
> wären, nur man sollte es nicht wie hier übertreiben.
Da Makros ja nur simple Textersetzung sind und man damit viel falsch 
machen kann, haben Java (und die meisten anderen Sprachen) das nicht, 
dafür aber andere Mechanismen zur Abstraktion.

foobar schrieb:
> Ernsthaft? Einfacher geht es doch gar nicht. Wie würdest du denn den
> Zugriff auf eine Struktur machen, dessen Adresse in 0x3000200 steht?
Eine Alternative wäre:
1
#ifdef __cplusplus
2
extern "C"
3
#else
4
extern
5
#endif
6
ROM_API_T* const ROM_API;
und im Linker-Script (hier: GNU LD Syntax):
1
ROM_API = 0x03000200;

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.