PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C] preprocessor & concatenation


noid
2009-09-22, 12:26:30
Hallo,

ich habe hier eine etwas unglückliche Lage, 2 Codeteile benutzen macros, die ich nicht ändern kann - aber einbauen muss.

Jetzt folgender Beispielcode:
/*****************************************************
*
* Macro_Test.c
*
* Description : Hello World in C, Ansi-style
*
*/

#include <stdio.h>

//... diese structs gibt es in verschd Ausführungen, automatisch generiert:
typedef struct
{
unsigned int APP_01_DataValue_1;
unsigned int APP_01_DataValue_2;
int APP_unused_1_[4];
} APP1DebugStruct;

//hier das Problem, kommt eigentlich aus einer anderen Header Datei:
#define DATA_PACKAGE1 1
#define DATA_PACKAGE2 2

//hier kommt das Übel, habe es bewusst so verkürzt, da nur die ## "stören":
#define PUSH_DEBUG_DATA(a, b, c, d) \
{ \
((a ## b ## DebugStruct*)test)->c = d \
}


int main(void)
{
APP1DebugStruct*test, a;
int value = 3
test = &a;

PUSH_DEBUG_DATA(APP, DATA_PACKAGE1, APP_01_DataValue_1, value);
PUSH_DEBUG_DATA(APP, DATA_PACKAGE1, APP_01_DataValue_2, (++value));

printf( "Hello world\n" );
}

Das bereitet aber ein Problem: das DATA_PACKAGE1 wird von dem Makro als Zeichenkette behandelt, APPDATA_PACKAGE1DebugStruct gibt es aber nicht.

Jetzt kommt mir gerade beim Tippen die Idee über ein enum ... mal ausprobieren. Jemand sonst noch ne Idee?

Xmas
2009-09-22, 13:07:28
Dies sollte funktionieren:
#define CONCAT(a, b) a##b
#define PUSH_DEBUG_DATA(a, b, c, d) \
{ \
((CONCAT(a,b) ## DebugStruct*)test)->c = d; \
}

noid
2009-09-22, 14:16:49
Uh, danke.

Jetzt hab ich nur das Problem, dass der Preprozessor output stimmt - dummerweise bekomme ich jetzt aber build-fehler, die sich über den typecast stören (den Typecast brauch ich aber).

Wenn ich jetzt die Zeile aus der per-Datei in das Projekt testweise kopiere geht's; stand ja auch so drin wie es erwartet wird. Mal weiterschauen was da wieder schief geht.

Makros sind böse =/