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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.