www.mikrocontroller.net

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


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
#define MeinDatentypName uint8_t
einen anderen Namen für den Datentyp zu erzeugen und dann mit
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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
typedef uint8_t MeinDatentypName;

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin schrieb:

> Ist es möglich, mit
>
>
#define MeinDatentypName uint8_t
> einen anderen Namen für den Datentyp zu erzeugen und dann mit
>
>
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
#define CHAR_PTR   char *

int main()
{
  CHAR_PTR a, b;
}
welche Datentypen haben a bzw. b?

typedef char * Char_Ptr;

int main()
{
  Char_Ptr a, b;
}
Welche Datentypen haben a und b jetzt?

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Was bringt dich zu diesem Gefühl?

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.