#define....Unterschied?

Was ist der Unterschied zwischen:
1:
void main(){
struct MyHandle { int unused; };
typedef const struct MyHandle FAR* h;
MyHandle myHandle;
myHandle.unused=12;
}
und 2:
#define MyDECLARE(h) struct _##h { int unused; };\ typedef const struct _##h FAR* h
void main(){
MyDECLARE(MyHandle);
MyHandle myHandle;
myHandle.unused=12;
}

1steres funktioniert einwandfrei aber bei dem 2ten bekomme ich die FM ‚error C2228: Der linke Teil von ‚.unused‘ muss eine Klasse/Struktur/Union sein‘
Leider hab ich das 2te vorgegeben und muß damit arbeiten und bin nun ein bißchen ratlos.

cu Desian

Hi Desian :smile:

Führen wir doch einfach mal die Makroersetzung durch:

#define MyDECLARE(h) struct \_##h { int unused; }; \
 typedef const struct \_##h FAR\* h

wird aufgerufen mittels

MyDECLARE(MyHandle);

Der Markro-Aufruf wird daher ersetzt durch:

struct \_MyHandleh { int unused; };
typedef const struct \_MyHandleh FAR\* h

Es gibt also jetzt 2 neue Datentypen: „_MyHandleh“ und „h“. Daher macht deine nachfolgende Definition von myHandle keinen Sinn, weil es den Datentyp „MyHandle“ nicht gibt …

MyHandle myHandle;
myHandle.unused=12;

kann also nur mit einem Fehler enden.

cu Stefan.

Hi Steffan,

Das erste baut ein struckt mit 1 int, is klar.
Das zweite baut einen Pointertyp darauf.
Das diese zweite Variante irgendwie funktionieren muß daran besteht kein Zweifel. Ich hab das nämlich aus nem Sorce gelaut. Die 1te Variante ist eigendlich nichts weiter als dieses #define mal ausklamüsert. Irgendwas muß es aber anders machen, denn bei mir kommt beim #define ein Fehler und bei dem Ausklamüserten halt nicht.
Ich muß aber dieses #define leider benutzen, da hab ich keine Wahl (kompartibilität mit anderen Komponenten). Das Ding is aus 'ner *.h, die ich benutzen muß.

cu Desian

OK!
DAS >>>>’_’

Hi Desian :smile:

DAS >>>>’_’