Forum: Compiler & IDEs #define für Datentypen?


von Martin (Gast)


Lesenswert?

Ich versuche bestehenden Code in ein Programm von mir einzubinden und 
bekomme jede Menge Fehler beim Compilieren. Deshalb mal eine 
grundsätzliche Frage:

Ist es möglich, mit
1
#define MeinDatentypName uint8_t
einen anderen Namen für den Datentyp zu erzeugen und dann mit
1
MeinDatentypName meineVariable;
Variablen zu erzeugen? Das wird im bestehenden Code nämlich so gemacht, 
wahrscheinlich um eine bessere Portabilität zu erreichen für andere 
Compiler, wo die Datentypen anders heissen. Ich habe aber das Gefühl, 
dass es ein grundsätzliches Problem damit gibt.

Grüsse

Martin

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

#define definiert einen simplen Makro.  Das ist eine reine Texter-
setzung, jedes spätere Vorkommen des Bezeichners MeinDatentypName
wird also später durch die rechte Seite des Makros ersetzt (also
"uint8_t" in diesem Falle).

Besser wäre hier aber ein typedef:
1
typedef uint8_t MeinDatentypName;

von Karl H. (kbuchegg)


Lesenswert?

Martin schrieb:

> Ist es möglich, mit
>
>
1
#define MeinDatentypName uint8_t
> einen anderen Namen für den Datentyp zu erzeugen und dann mit
>
>
1
MeinDatentypName meineVariable;
> Variablen zu erzeugen?

Möglich ist es schon.
Aber das sollte man eigentlich nicht tun.
Genau dafür gibt es den typedef

Anders als #define berücksicht nämlich der typedef auch die C-Regeln. 
#define veranlasst lediglich Textersetzungen

zb
1
#define CHAR_PTR   char *
2
3
int main()
4
{
5
  CHAR_PTR a, b;
6
}
welche Datentypen haben a bzw. b?

1
typedef char * Char_Ptr;
2
3
int main()
4
{
5
  Char_Ptr a, b;
6
}
Welche Datentypen haben a und b jetzt?

Welche Variante davon ist logischer und welche ist für Überraschungen 
gut?

von Karl H. (kbuchegg)


Lesenswert?

> Ich habe aber das Gefühl,
> dass es ein grundsätzliches Problem damit gibt.

Was bringt dich zu diesem Gefühl?

von Martin (Gast)


Lesenswert?

> Was bringt dich zu diesem Gefühl?

Weil jeweils auf den Zeilen, wo dann eine Variable so erzeugt wurde, ein 
Fehler geworfen wurde. Wie wenn der Compiler nicht wüsste, was 
MeinDatentypName ist.

Den Code habe ich jetzt nicht hier, und er ist insgesamt auch viel zu 
umfangreich um den ganzen zu posten, wenn Ausschnitte davon helfen kann 
ich später was posten.

Wenn das grundsätzlich funktionieren sollte (wenn ich auch glaube dass 
es nicht schön ist) muss der Fehler wohl woanders liegen.

von Karl H. (kbuchegg)


Lesenswert?

Martin schrieb:
>> Was bringt dich zu diesem Gefühl?
>
> Weil jeweils auf den Zeilen, wo dann eine Variable so erzeugt wurde, ein
> Fehler geworfen wurde. Wie wenn der Compiler nicht wüsste, was
> MeinDatentypName ist.

Dann wird dort wahrscheinlich der Include fehlen, in dem die #define 
enthalten sind.

> Den Code habe ich jetzt nicht hier, und er ist insgesamt auch viel zu
> umfangreich um den ganzen zu posten, wenn Ausschnitte davon helfen kann
> ich später was posten.

Als Anfang wäre ein *.c File, das den Fehler zeigt hilfreich. 
Interessant ist der Anfang bis zum ersten derartigen Fehler.

Richte dein besonderes Augenmerk auf irgendwelche Include. Insbesondere 
interessiert mich, wo die #define für die Datentypen herkommen. 
Sinnvollerweise wird man diese #define in einem Header File sammeln und 
das dann überall dort #includ-en, wo es benötigt wird.

Achte auch darauf, ob du nicht zufällig bei deinen eigenen Include Files 
eines dabei hast, das den gleichen Namen hat, wie dasjenige Include mit 
den #define.

von Karl H. (kbuchegg)


Lesenswert?

Edit:

Es gibt natürlich auch noch die Möglichkeit, dass der 
Originalprogrammierer, die #define für die Datentypen im makefile hat, 
und diese per Command Line Switch an den Compiler übergibt.

Wenn er das getan hat, solltest du gleich mal den nassen Fetzen richten 
um ihn ihm um die Ohren zu schlagen.

Aber so richtig mag ich nicht daran glauben. Wahrscheinlich fehlt 
einfach nur ein #include mit der richtigen Datei.

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.