#defines innerhalb funktionen definieren

Gast #935426
Hi,
ich frage mich gerade ob ich ein #define auch in einer Funktion 
schreiben kann.
Wird dass dann richtig übersetzt, ist ja ein Präprozessorbefehl, der 
eigentlich nix mit dem Programmablauf zu tun hat.

Grund:
Ich möchte char in seine Bits unterteilen.
Auf die Art des Typedef will ich aber verzichten, da das ja nicht in 
Ansi C standardisiert ist und bei einem Controllerwechsel problematisch 
werden könnte.

Meine idee:
1
void main (void)
2
{
3
#define main_VAR1_BIT1 0x01
4
#define main_VAR1_BIT2 0x02
5
#define main_VAR1_BIT3 0x04
6
...
7
unsigned char Var1 = 0;
8

9
...
10
if(Var1 & main_VAR1_BIT2) 
11
  ;//tu was
12
}

Spricht was dagegen #defines innerhalb von Funktionen zu definieren??

lg
niebNoob
Prinzipiell kannst du es natürlich machen. Was für mich dagegen sprechen 
würde, wäre dass der Code eben schnell unübersichtlich wird.
Macros oder defines gehören für mich immer an den Anfang oder eben in 
eine entsprechende Header-Datei, alles andere stiftet nur verwirrung.
Du könntest es ja auch mit Bitfeldern machen!
Was genau meinst du "Auf die Art des Typedef will ich aber verzichten", 
ich weiß jetzt gerade nicht welches du meinst
Gast
Danke für den tipp,...

Ich meinte sowas:

[c]
typedef
{
  int bit1 : 1;
  int bit2 : 1;
  int bits_rest : 6;
} einByte;

einByte is_aByte;

void main (void)
{
...
if(is_aByte.bit1 == 1)
  ; //tu was
}

Hier ist jetzt das problem, dass dieser Typedef nun Compilerabhängig mal 
von oben nach un´ten oder umgekehrt abgearbeitet wird.


Aber ich glaub dann belass ichs bei den Hexzahlen,...

Gruß
Gast
Der Vollständigkeit halber, da fehlte noch was:
So ists richtig!
1
typedef struct
2
{
3
  int bit1 : 1;
4
  int bit2 : 1;
5
  int bits_rest : 6;
6
} einByte;
7

8
einByte is_aByte;
9

10
void main (void)
11
{
12
...
13
if(is_aByte.bit1 == 1)
14
  ; //tu was
15
}
Persönliche Seite
die #defines sind dann aber in der gazen datei gültig... nicht nur in 
der fkt.

und es reicht
1
if(is_aByte.bit1)
2
  //tu was

zu schreiben...

und ja Bitfelder sollte man vermeiden...

ich schreib meistens
1
if(is_aByte & (1<<4))
2
  //tu was

so ist wenigstens zu sehen was gemeint ist (hier das 4. Bit von 0 
anfangen zu zählen)
Gast
Ich würde gleich noch das Bit so benennen, welche Funktion es inne hat:
z.B.
#define Vorzeichen 4

if(is_aByte & (1<<Vorzeichen))
  //tu was


Wenn z.B. bei einem if  der Vergleich weggelassen wird, hat das immer 
die Bedeutung von  !=0 , also wenn xyz ungleich Null.
Gast
Cool danke fuer die antworten,...

ich mag mich irren, aber mit dem
1
if(is_aByte & (1<<4))
2
  //tu was

gibts ja noch nen weiteren schiebebefehl,...
mehr (Assembler-)code zu bearbeiten als bei
1
if(is_aByte & 0x04)
2
  //tu was

Ich glaub ich bleib bei der Hex Methode (ohne define)
Gruß und merci,...
newbnoob
Moderator Persönliche Seite
newbieNoob wrote:

> ich frage mich gerade ob ich ein #define auch in einer Funktion
> schreiben kann.

Ja, natürlich.  Wenn du das schon tust, solltest du aber aus
Gründen der Übersichtlichkeit und zur Fehlervermeidung am Ende
der Funktion noch die zugehörigen #undef-Anweisungen spendieren.
newbieNoob wrote:

> ich mag mich irren, aber mit dem
1
if(is_aByte & (1<<4))
2
  //tu was
>
> gibts ja noch nen weiteren schiebebefehl,...
> mehr (Assembler-)code zu bearbeiten als bei
1
if(is_aByte & 0x04)
2
  //tu was

Nein, (1<<4) ist eine Konstante, die schon beim Compilieren berechnet 
wird. Der Assemblercode ist in beiden Fällen identisch(*).

(*) Nun, natürlich nicht 100%ig identisch, denn (1<<4) ist nicht 0x04, 
sondern 0x10.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 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.