Compiler-Direktive #define auswerten? #define foo 1; #if (foo ==1)?

OP #5112974
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....
Gast #5112980
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.
Beitrag #5112986 wurde von einem Moderator gelöscht.
OP #5113012
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..
Gast #5113021
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.
OP #5113224
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...
#5113233
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.
Gast #5113242
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?
OP #5113291
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
Angehängte Dateien:

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