Kann man in c auch mit defines schieben?

Gast #1934847
Lesenswert?

Hallo,
kann man in c auch mit defines schieben.
Im folgenden ein kurzes Beispiel, welches die untenstehende 
Fehlermeldung bringt.
Falls diese problem nicht zu lösen ist, gibt es andere Möglichkeiten als 
nur mit Konstanten zahlen zu schieben?

#define SHIFT
unsigned long b
unsigned long a


a = (b>>SHIFT)  // diese Zeile gibt bei mir die //fehlermeldung 
:D:\moogsoft\extlvdt\src\extlvdsyc.c(398): error:  //#31: expression 
must have integral type (KEIL compiler)

Danke!

Gruß
Samuel
#1934856
Lesenswert?

Sam schrieb:
> Hallo,
> kann man in c auch mit defines schieben.

Nein.
Und das liegt daran, dass #define nicht das macht was du denkst das es 
macht.

#define ist einfach nur die Anweisung an den Präprozessor im 
nachfolgenden Text Textersetzungen vorzunehmen. So wie wenn du in deinem 
Editor die Editor Funktion Suchen&Ersetzen benutzen würdest.


> #define SHIFT

das legst fest, dass der Text SHIFT durch nichts zu ersetzen ist.

> a = (b>>SHIFT)  // diese Zeile gibt bei mir die //fehlermeldung

dann mach mal die Textersetzung. Ersetzte den Text SHIFT durch nichts.
Dann steht da

  a = (b>>)  // diese Zeile gibt bei mir die //fehlermeldung

und das ist kein gültiges C


C-Buch kaufen und durcharbeiten!
Gast #1934867
Lesenswert?

wenn ich folgendes in meinem programm schreibe bekomme ich trotzdem die 
fehlermeldung "error:  #31: expression must have integral type"
woran liegt das???

#define SHIFT 3

unsigned long b
unsigned long a


a = (b>>SHIFT);
#1934871
Lesenswert?

Sam schrieb:
> wenn ich folgendes in meinem programm schreibe bekomme ich trotzdem die
> fehlermeldung "error:  #31: expression must have integral type"

höchst wahrscheinlich an einem Tippfehler in deinem RICHTIGEN Code. 
Oder auch an etwas völlig anderem.

Poste deinen richtigen Code und hör auf hier im Forum Code direkt 
einzutippen. Wozu das führt hast du ja jetzt zur Genüge gesehen. Wir 
gehen auf Fehler ein, die du gar nicht gemacht hast.
Gast #1934900
Lesenswert?

Ich habe gerade festgestellt, dass

#define SHIFT 3 //funktioniert


//der Originalcode ist aber:
#define SHIFT log(32)/log(2)  //Fehlermeldung: "expression must have 
integral type"


Wie kann ich das beheben?
#1934971
Lesenswert?

Machs doch erst mal ohne defines und wenn es sich kompillieren lässt und 
funktioniert, dann erst aus den gewünschten Teilen ein define.
Ein define ersetzt wirklich nur Text bevor dieser kompilliert wird und 
macht sonst keine Hexerei.

Die Hexerei kommt erst ins Spiel, wenn Du noch die speziellen Features 
des Preprocessors brauchst wie z.B. ## um Strings zusammenzusetzen. ;-)
#1934977
Lesenswert?

Sam schrieb:
> Ixh habe
>
> #define SHIFT ((unsigned long)(log(32)/log(2)))
>
> gerade ausprobiert, bringt aber die gleiche Meldung

Und nochmal die Aufforderung: poste richtigen Code
1
#include <avr/io.h>
2
#include <math.h>
3

4
#define SHIFT ((unsigned long)(log(32)/log(2)))
5

6
int main()
7
{
8
  int i;
9
  i = 5 << SHIFT;
10
}
compilier mit dem gcc einwandfrei. Verwundert auch nicht weiter, denn es 
entspricht den C-Regeln.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren