Präprozessor: Auswertung von Argumenten

OP Persönliche Seite #1063468
Lesenswert?

Hallo an alle,

Ich habe eine Frage zum C Präprozessor. Ich möchte bei der Deklaration 
einer Struktur die Argumente auswerten. Die Struktur darf nur Deklariert 
werden, wenn die Argumente Gültig sind. (Der Wert zweier Argumente muss 
ungerade sein).
1
typedef struct foo
2
{
3
  uint8_t var1;
4
  uint8_t var2;  //muss bei der Deklaration ungerade sein
5
  uint8_t var3;  //muss bei der Deklaration ungerade sein
6
} sFoo;
7

8
sFoo s1 = {10, 7, 5};
9
sFoo s2 = {10, 8, 5};   //Diese Deklaration sollte ungültig sein und eine Fehlerausgabe erfolgen

Nur wie mache ich das mit dem Präprozessor??

Ich hoffe es kann mir wer helfen.
Danke im Voraus
Gruß Robert
OP Persönliche Seite #1063577
Lesenswert?

Ne nicht wirklich.

Also Die Werte der Variablen ist egal. Nur müssen die zwei letzten Werte 
ungerade sein

Ich dachte mir das ewa so in der Art:
1
#define FOO(arg1, arg2, arg3)  \
2
#if(!(arg2 %2) || (!(arg3 % 2))\
3
#error Ungültige Deklaration   \  //Hier müsste der Struktur der Wert null übergeben werden
4
#else                          \
5
{arg1,arg2,arg3}               \
6
#endif                        
7

8
sFoo s = FOO(123, 20, 27);

Weiß jemand wie sowas in der Art geht?
Gruß Robert
Gast #1063590
Lesenswert?

>Nur wie mache ich das mit dem Präprozessor??

Elegant gar nicht.

Man könnte sich z.B. sowas basteln:
1
#define PAR1 10
2
#define PAR2 8
3
#define PAR3 4
4

5
#if ((PAR2/2)*2) == PAR2
6
#error "Parameter 2 ist nicht ungerade"
7
#endif
8

9
#if ((PAR3/2)*2) == PAR3
10
#error "Parameter 3 ist nicht ungerade"
11
#endif
12

13
sFoo s1 = {PAR1, PAR2, PAR3};
14

15
#undef PAR1
16
#undef PAR2
17
#undef PAR3

un das dann für alle Deklarationen wiederholen.
Aber schön ist anders.

Oliver
#1063695
Lesenswert?

Der Präprozessor besorgt reine Textersetzung! Nicht mehr und nicht 
weniger.
Insbesondere sind in Präprozessor-Macros keine Präprozessor-Statements 
möglich.

Möglich ist allerdings folgendes (statt irgendwelchen Prüfungen im 
Macro):

#define FOO_INIT(p1,p2,p3) {p1, 2 * (p2) + 1, 2 * (p3) + 1)}

Ist es jetzt klar?

Bernhard

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