Makro für #if #else #endif

OP #2532624
Lesenswert?

Hallo!

Meine C-Kenntnisse stehen nun am Ende ;)

Ich habe in meinem Projekt V-USB.
Das braucht in meiner main.c diese Funktionen um ohne Fehler zu 
kompilieren:
1
uchar usbFunctionRead(uchar *data, uchar len)
2
{
3
}
4
uchar usbFunctionWrite(uchar *data, uchar len)
5
{
6
}
7
usbMsgLen_t usbFunctionSetup(uchar data[8])
8
{
9
}

Nun will ich einen Kompilerswitch machen um V-USB auszuschließen.

Also ca so:
1
#if USB == 1
2
uchar usbFunctionRead(uchar *data, uchar len)
3
{
4
}
5
uchar usbFunctionWrite(uchar *data, uchar len)
6
{
7
}
8
usbMsgLen_t usbFunctionSetup(uchar data[8])
9
{
10
}
11
#endif

Nun meldet mir AVR Studio natürlich Fehler, da V-USB trotzdem erzeugt 
wird einen Fehler weil er die Funktionen nicht finden kann.

Beim IRMP Source habe ich sowas gesehen dass dann einfach ein Makro 
erzeugt wird:
1
#if IRMP_LOGGING == 1
2
static void
3
irmp_log (uint8_t val)
4
{
5
}
6
#else
7
#define irmp_log(val)
8
#endif

Wie muss ich das mit den Funktionen für V-USB umsetzen - ich schaffe es 
einfach nicht...
Gast #2532705
Lesenswert?

Im Header :

if defined (VUSB)
 #define USBSETUP(d)    usbFunctionSetup(d)
 #define USBREAD(d,n)   usbFunctionRead(d,n)
 #define USBWRITE(d,n)  usbFunctionWrite(d,n)
#else
 #define USBSETUP(d)
 #define USBREAD(d,n)
 #define USBWRITE(d,n)
#endif


Und im USBXXX im Programm benutzen.

Stefan
OP #2536001
Lesenswert?

Hat keiner eine lösung für mich?

Derzeit habe ich hier ein Projekt, wo bei einem Master V-USB benutzt 
wird und beim Slave nicht.

Über einen Compiler Switch schalte ich zwischen Master und Slave um.
Beim Master müssen die usbdrv Datein im Projekt sein, da er sonst die 
Funktionen wie usb_init usw nicht findet.

Im Slave muss ich sie rausnehmen da es ansonsten zu den oben genannten 
Fehler kommt. Mit der Zeit ist das etwas umständlich und ich frage mich 
ob das mit AVR Studio v5.1 nicht irgendwie Automatisierbar ist!?
OP #2537348
Lesenswert?

Läubi .. schrieb:
> Hugo Portisch schrieb:
>>> Hat keiner eine lösung für mich?
>>  Die Lösung wurde doch shcon genannt! Du mußt das mit dem define schon
>>  durchziehen oder soweit modularisieren, das einfach zwei executables
>>  rauskommen eines für client und eines für server...

Ich habe schon einige Sachen mit dem #define probiert, schagffe es aber 
nicht.

Das kann ich ja so nicht 1:1 verwenden, oder?
#define USBSETUP(d)    usbFunctionSetup(d)

Gerade wie das mit dem Rückgabe der Funktionen funktionieren soll 
verstehe ich nicht.
#2537365
Lesenswert?

Hugo Portisch schrieb:
> Gerade wie das mit dem Rückgabe der Funktionen funktionieren soll
> verstehe ich nicht.

Dann mach halt in dem Zweig, wo es kein USB geben soll, die Defines zu 
einer Statischen 0 oder einem anderen ungefährlichen Rückgabewert.
1
#if USB == AN
2
#define USB_FUNKTION_DIE_WAS_ZURUECK_GIBT(d)   fzurueck(d)
3
#else
4
#define USB_FUNKTION_DIE_WAS_ZURUECK_GIBT(d)   0
5
#endif
mfg mf
#2537651
Lesenswert?

Hugo Portisch schrieb:
> Derzeit habe ich hier ein Projekt, wo bei einem Master V-USB benutzt
> wird und beim Slave nicht.

Warum machst Du nicht einfach 2 Projekte auf?
Das USB wird doch bestimmt nicht der einzige Unterschied zwischen den 2 
Programmen sein.
Die gemeinsamen Teile kann man ja trotzdem in einem gemeinsamen 
Verzeichnis erstellen.

Wenn man mit Gewalt 2 Projekte zu einem vermischt, leidet die 
Übersichtlichkeit und steigt die Fehleranfälligkeit.


Peter
OP #2537951
Lesenswert?

Peter Dannegger schrieb:
> Warum machst Du nicht einfach 2 Projekte auf?
>
> Das USB wird doch bestimmt nicht der einzige Unterschied zwischen den 2
> Programmen sein.
> Die gemeinsamen Teile kann man ja trotzdem in einem gemeinsamen
> Verzeichnis erstellen.
>
>
> Wenn man mit Gewalt 2 Projekte zu einem vermischt, leidet die
> Übersichtlichkeit und steigt die Fehleranfälligkeit.

Ich glaube das wird auch die Endlösung werden...

Wenn ich dann jedoch auch einen Slave mit USB haben will brauche ich 
schon 3 Projekte :(

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren