Forum: Compiler & IDEs Präprozessor: Auswertung von Argumenten


von Robert S. (razer) Benutzerseite


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

von Bernhard R. (barnyhh)


Lesenswert?

Es gilt also
1. var2 = 2 * k2 + 1
2. var3 = 2 * k3 + 1

Klar?

Bernhard

von Robert S. (razer) Benutzerseite


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

von Sven P. (Gast)


Lesenswert?


von Oliver (Gast)


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

von Bernhard R. (barnyhh)


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

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.