www.mikrocontroller.net

Forum: PC-Programmierung C: too many arguments for macro


Autor: Pascal (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich compiliere ein Projekt für einen Freescale HCS12 mit einem 
Cosmic-Compiler. Im header-file module1.h steht folgendes:
#ifdef MODULE1_FILE_IDENT_C
    #define XMOD_EXTERN
    #define XMOD_INIT(initVal) = initVal
#else
    #define XMOD_EXTERN extern
    #define XMOD_INIT(initVal)
#endif

Im C-File module1.c existiert das #define MODULE_FILE_IDENT_C, welches 
dafür sorgt, dass die Variablen aus der module1.h nur in diesem 
Sourcefile angelegt und initialisiert werden. In anderen Sourcefiles, 
die die module1.h ebenfalls inkludieren, sollen die Variablen als extern 
deklariert werden.

Die module1.h legt das folgende Array an:
XMOD_EXTERN uint16_T TEST_ARRAY[12] XMOD_INIT({0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2});

Beim compilieren erhalte ich für die obige Zeile die Fehlermeldung "too 
many arguments for macro XMOD_INIT". Eigentlich sollte der Präprozessor 
nur suchen und ersetzen. Die Kommata in dem Array sollte er dabei doch 
gar nicht mitbekommen. Als Workaround habe ich die Initialisierung durch 
ein define ersetzt, was ohne Fehler compilierte.
#define INIT_TEST_ARRAY {0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8}
XMOD_EXTERN uint16_T TEST_ARRAY[12] XMOD_INIT(INIT_TEST_ARRAY);

Hat jemand eine Idee, wie man ein Macro realisieren kann ohne auf dieses 
IMO überflüssige define ausweichen zu müssen?

Danke für die Aufmerksamkeit!

Autor: mar IO (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zu deinem Problem habe ich keine Lösung, aber ich glaube das brauchst Du 
auch gar nicht (weiß nicht zu 100% was Du damit erreichen möchtest und 
wieso).

Außerdem wird mit deinen Defines der Code unleserlich und was spricht 
gegen (wenn man sowas überhaupt braucht):
#ifdef MODULE1_FILE_IDENT_C
    uint16_T TestArray[12] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2};
#else
    extern uint16_T TestArry[12];
#endif

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Normalerweise gilt die Regel: Deklarationen ins .h-File, Definitionen
ins .c-File. Hältst du dich daran, brauchst du nicht einmal eine
Fallunterscheidung, geschweige denn irgendwelche Makros:

irgendwas.h:
extern uint16_t TestArry[12];
//...

irgendwas.c:
#include "irgendwas.h"
//...
uint16_t TestArray[12] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2};

wasanderes.c:
#include "irgendwas.h"
//...
// Zugriffe auf TestArray

Die Definition exisitiert nur in einem einzigen .c-File, nämlich
irgendwas.c. Das Headerfile irgendwas.h mit der Deklaration kann in
beliebig vielen .c-Files, u.a. auch in irgendwas.c, eingebunden werden.

Das ist der normale Weg, wie es fast jeder macht.

Edit:

Zu deiner Frage, warum das Makro nicht funktioniert: Nur runde Klammern
klammern Kommata in Makroargumenten. Geschweifte Klammern hingegen sind
für den Präprozessor ganz normale Zeichen. Der Aufruf
XMOD_INIT({0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2})

hat also 12 Argumente, der erste davon ist "{0", der zweite "1" und der
letzte "2}" (jeweils ohne die Anführungszeichen). Deswegen erscheint die
Fehlermeldung.

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
BTW, es gibt auch Variadic Macros, z.B.
#define XMOD_INIT(...)  = __VA_ARGS__

MfG Mark

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.