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

OP #5112974
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
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
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
..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
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...
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
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
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

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