Forum: Compiler & IDEs Compiler-Direktive #define auswerten? #define foo 1; #if (foo ==1)?


von Thomas L. (delfinis)


Lesenswert?

Hallo
versuche gerade per define verschiedene Versionen zu definieren mit:
1
//#define SENSORTYPE ST_HUMIDITY
2
//#define SENSORTYPE ST_TEMPERATURE
3
#define SENSORTYPE ST_PRESSURE
4
5
#if (SENSORTYPE == ST_HUMIDITY)
6
  char msg[5];
7
#elif (SENSORTYPE == ST_TEMPERATURE)
8
  char msg[10];
9
#elif (SENSORTYPE == ST_PRESSURE)
10
  char msg[7];
leider nimmt er immer nur den ersten Ausdruck (char msg[5];). Ich nehme 
mal an, dass der erste Ausdruck immer true ist weil SENSORTYPE 
definiert. Aber wie kann ich schauen, ob SENSORTYPE eben dem definierten 
Wert (z.B. PRESSURE) entspricht.
Leider sind in den wikis und tutorials immer nur die #define erklärt, 
nicht aber wie man sie auswerten kann....

von root (Gast)


Lesenswert?

Wie sind denn deine Drei Werte für
ST_HUMIDITY
ST_TEMPERATURE
ST_PRESSURE

definiert?

der Preprozeeor macht an dieser Stellle kein Sring vergleich sonden 
ersetzt die Strings gegen nummerische Werte. Wenn er dabei auf ein 
unbekanntes Symbol trift, dann wird dieses zu 0.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Wenn du GCC verwendest, kannst du mit -save-temps -g3 im i-File (C) bzw. 
ii-File (C++) die Makros und deren Expansion sehen.

Beitrag #5112986 wurde vom Autor gelöscht.
von (prx) A. K. (prx)


Lesenswert?

root schrieb:
> Wenn er dabei auf ein
> unbekanntes Symbol trift, dann wird dieses zu 0.

Weshalb hier jeder Tippfehler fatal ist. Ein Grund, den Präprozessor 
möglichst sparsam in dieser Form einzusetzen.

von Thomas L. (delfinis)


Lesenswert?

Hallo zusammen und danke für die Antworten,
hab mir die Makros angeschaut aber nichts mit SENSORTYPE gefunden.
(Zu den Tippfehlern: ich habe mir gerade deshalb angewöhnt nicht zu 
tippen, sondern zu kopieren.)
Sollte ich dann so was coden?
1
//#define SENSORTYPE 0 // humidity
2
//#define SENSORTYPE 1 // temperature
3
#define SENSORTYPE 2 // pressure
4
5
#if (SENSORTYPE == 0)
6
  char msg[5];
7
#elif (SENSORTYPE == 1)
8
  char msg[10];
9
#elif (SENSORTYPE == 2)
10
  char msg[7];

geht eben auch nicht...

Aber ich hab so das gefühl, dass der Vergleich eventuell anders sein 
müsste, weil die syntax des päprozessors ja anders ist wie z.B.
#if (x = y) oder
#if (x is y) oder so..

: Bearbeitet durch User
von g457 (Gast)


Lesenswert?

..irrgendwas macht Du grob falsch:
1
$ cat test.c 
2
#define ST_HUMIDITY     0
3
#define ST_TEMPERATURE  1
4
#define ST_PRESSURE     2
5
6
#if (SENSORTYPE == ST_HUMIDITY)
7
        #error "ST_HUMIDITY"
8
#elif (SENSORTYPE == ST_TEMPERATURE)
9
        #error "ST_TEMPERATURE"
10
#elif (SENSORTYPE == ST_PRESSURE)
11
        #error "ST_PRESSURE"
12
#else
13
        #error "none"
14
#endif
15
16
$ for x in 0 1 2 3 "" ; do echo -e "\n--testing: '$x'" ; gcc -Wall -o /dev/null -DSENSORTYPE=$x test.c ; done
17
18
--testing: '0'
19
test.c:6:3: error: #error "ST_HUMIDITY"
20
  #error "ST_HUMIDITY"
21
   ^~~~~
22
23
--testing: '1'
24
test.c:8:3: error: #error "ST_TEMPERATURE"
25
  #error "ST_TEMPERATURE"
26
   ^~~~~
27
28
--testing: '2'
29
test.c:10:3: error: #error "ST_PRESSURE"
30
  #error "ST_PRESSURE"
31
   ^~~~~
32
33
--testing: '3'
34
test.c:12:3: error: #error "none"
35
  #error "none"
36
   ^~~~~
37
38
--testing: ''
39
test.c:5:17: error: operator '==' has no left operand
40
 #if (SENSORTYPE == ST_HUMIDITY)
41
                 ^~
42
test.c:7:19: error: operator '==' has no left operand
43
 #elif (SENSORTYPE == ST_TEMPERATURE)
44
                   ^~
45
test.c:9:19: error: operator '==' has no left operand
46
 #elif (SENSORTYPE == ST_PRESSURE)
47
                   ^~
48
test.c:12:3: error: #error "none"
49
  #error "none"
50
   ^~~~~

Zeig doch mal den Rest.

von Thomas L. (delfinis)


Lesenswert?

Bitte sehr..
1
//#define SENSORTYPE 0
2
#define SENSORTYPE 1
3
//#define SENSORTYPE 2
4
5
6
function f() {
7
  #if (SENSORTYPE == 0)  
8
    uint8_t msg[30];
9
  #elif (SENSORTYPE == 1)
10
    uint8_t msg[22];
11
  #elif (SENSORTYPE == 2)
12
    uint8_t msg[27];
13
  #endif  
14
15
...
16
}

Es gibt da nicht mehr, es sollten 22 Byte alloziert werden, leider 
werden immer 30 Byte-Arrays alloziert.
Liegt es vielleicht am Kompiler von Atmel Studio? Ich hab schon 
festgestellt, dass z.B. für C++ auch nicht alles implementiert war z.B. 
Kontstruktor/Destruktor...

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Thomas I. schrieb:
> Bitte sehr..

Du solltest etwas posten, dass man übersetzen kann. Komplett alle deine 
Files, die dafür nötig sind. Ohne "...".

> function f() {

Vielleicht bin ich nicht ganz auf der Höhe des neuesten C oder C++ 
Standards. Aber so richtig nach C/C++ sieht das für mich nicht aus. Oder 
was ist "function"?

> dass z.B. für C++ auch nicht alles implementiert war z.B.
> Kontstruktor/Destruktor...

Die kommen auch nicht von alleine, sondern werden programmiert. Ist 
schon eine Weile her dass ich C++ für AVR verwendete, aber das war kein 
Problem. Lücken gabs z.B. im exception handling.

: Bearbeitet durch User
von Kaj (Gast)


Lesenswert?

Fubnktioniert bei mir ganz wunderbar:
1
#include<iostream>
2
3
//#define SENSORTYPE 0
4
#define SENSORTYPE 1
5
//#define SENSORTYPE 2
6
7
int main()
8
{
9
    #if (SENSORTYPE == 0)
10
        uint8_t msg[30];
11
    #elif (SENSORTYPE == 1)
12
        uint8_t msg[22];
13
    #elif (SENSORTYPE == 2)
14
        uint8_t msg[27];
15
    #endif
16
17
    std::cout << "Size of msg: " << sizeof(msg) << std::endl;
18
19
    return 0;
20
}
1
Size of msg: 22

Thomas I. schrieb:
> Liegt es vielleicht am Kompiler von Atmel Studio?
Nein, denn da wird auch nur der GCC verwendet.

Das einzige was ich mir vorstellen kann:
- Du speicherst die Änderungen nicht und möglicherweise wird das nicht 
automatisch vorm compilieren gespeichert

- Mach mal ein "rebuild all"

Thomas I. schrieb:
> Ich hab schon
> festgestellt, dass z.B. für C++ auch nicht alles implementiert war z.B.
> Kontstruktor/Destruktor...
Und der Compiler soll woher genau wissen, was DU im c'tor/d'tor mache 
willst?

von Thomas L. (delfinis)


Angehängte Dateien:

Lesenswert?

Es funktioniert jetzt. Ich kann nicht mehr genau nachvollziehen wieso 
aber vielleicht lags wirklich am abspeichern oder rebuild. Nur hatte ich 
gestern schon daran gekämpft und der code war heute noch der selbe.
Ich hab dann mit "find all" mal nach "SENSORTYPE" gesucht, es wurden 
jedoch nur diejenigen im definitions-File gedunden auch wenn ich "Entire 
solution" angeklickt hab. Danach hab ich noch ein bisschen rumprobiert 
und plötzlich giengs.
Komisch ist auch z.B. dass der nicht zu kompilierende code nicht 
ausgegraut wird wie in anderen IDE's auch (siehe bild)
Nun ja, es tut jetzt.
Danke

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.