Makro für #if #else #endif

OP #2532624
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
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
Wenn du erreichen willst, dass es trotz Weglassen der Funktionen ohne 
Fehler gebaut wird, dann musst du dafür sorgen, dass auch der V-USB Code 
in dem Fall nicht übersetzt und gelinkt wird.
Mit USB == 0 muss auch der V-USB Code ausgeblendet werden.
OP
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
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.
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
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
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.