C/C++: Behandlung einer optionalen Präprocessor Direktive

rubricanis

Homo ludens
Die große Hitze ist zwar vorbei, aber dennoch scheine ich heute nur Matsch im Kopf zu haben. Kann mir da jemand auf die Sprünge helfen?

Ich benutze während der Entwicklung eine Präprozessor direktive 'trace' die ich ich mit gmake deklariere:
Code:
# gmakefile
trace ?=
...
ifeq ($(trace), out)
flags += -DTRACE
endif
In Prefix.hpp und im Quellcode habe ich dann:
Code:
#ifdef TRACE
    #define trace(module, args) cout << module << "::" << __func__ << "(" << args << ")" << endl
#endif
//  source
#ifdef TRACE
#include <iostream>
#define module xxx
#endif
Jetzt möchte ich als weitere Option allerdings neben 'out' noch 'log' haben; d.h. also außer den beiden noch undefined. Ich dachte das würde so funktionieren:
Code:
# makefile
trace ?=
...
ifeq ($(trace), out)
flags += -DTRACE=$(trace)
endif
ifeq ($(trace), log)
flags += -DTRACE=$(trace)
endif
Und in C++
Code:
#ifdef TRACE
   #if TRACE == out
     #define trace(module, args)\
       cout << module << "::" << __func__ \
       << "(" << args << ")" << endl
   #elif TRACE == log
     // dummy
     #define trace(module, args)  
   #else
     #define trace(module, args)
   #endif
#else
   #define trace(module, args)
#endif
Ich dachte das müßte so funktionieren, tut es aber nicht! Wenn ich 'log' setze (ist hier ja nur ein dummy) wird das Makro wie bei 'out' aktiviert. Undefined funktioniert erwartungsgemäß. Was mache ich hier falsch und wie macht man es richtig?

Peter
 
Das wird so nicht gehen, denn der Präprozessor unterstützt nur den Vergleich von Integern. Man kann es tricksen, aber schön ist es nicht:

Code:
#define log 1
#define out 2

#define option TRACE

#if option == log
  ...
#elif option == out
  ...
#endif
 
Das wird so nicht gehen, denn der Präprozessor unterstützt nur den Vergleich von Integern. [
Mamma mia, der Präprozessor ist ja genau so doof wie ich! Aber kein Problem, im Makefile mache ich einfach folgendes:
Code:
ifeq ($(trace), out)
flags += -DTRACE=1
endif

ifeq ($(trace), log)
flags += -DTRACE=2
endif
Das ist natürlich etwas unschön zwei scheinbar unabhängige Abfragen zu benutzen, daher noch eine Folgefrage: Wie kann man diese beiden Abfragen besser integrieren, also im Sinne von C:
Code:
if (trace == "on") TRACE = 1;
else if (trace == "log") TRACE = 2;
Oder geht das nicht ?
 
Zurück
Oben