Zum Debuggen benutze ich ein mc_debug-Makro:

Code:
// Debug messages for user and kernel space (if DeBuG is defined, else do nothing).
// Preparation because ANSI-/ISO-C99 does not know __FUNCTION__ (gcc feature).
#   ifndef __FUNCTION__
#      define __FUNCTION__ __func__
#   endif
#   if defined(DeBuG) || defined(DEBUG)
#      ifdef __KERNEL__
#         define mc_DEBUG(fmt, args...) { (void)printk(KERN_EMERG "mc_DEBUG: \"%s\", \"%s\", line %d: ", \
        __FILE__, __FUNCTION__, __LINE__); (void)printk(KERN_EMERG fmt, ## args); }
#      else
#          define mc_DEBUG(fmt, args...) { (void)fprintf(stderr, "mc_DEBUG: \"%s\", \"%s\", line %d: ", \
        __FILE__, __FUNCTION__, __LINE__); (void)fprintf(stderr, fmt, ## args); }
#      endif
#   else
#      define mc_DEBUG(fmt, args...)
#   endif

// same with debug level
#   if defined(DeBuG) || defined(DEBUG)
#      define mc_debug(debug_level, fmt, args...)\
   if (debug_level >= DEBUG_LEVEL)\
     {mc_DEBUG(fmt, ##args);}
#   else
#      define mc_debug(debug_level, fmt, args...)
#   endif
und gelegentlich brauche ich Hilfsvariablen zum Debuggen:

Code:
#define DeBuG
#define DEBUG_LEVEL 2

#if defined (DeBuG) and (DEBUG_LEVEL<2)
  unsigned long int uli_time = time(NULL);       // start time
#endif

mc_debug (1, "time marker 1; start for ic=%d, difftime=%ld\n", ic, time (NULL) - uli_time);
Aber damit habe ich das Problem, dass wenn DEBUG_LEVEL gleich 1 ist, dass dann der gcc diese Variable vermißt und error meldet, obwohl das Debug-Makro doch zu einer leeren Anweisung (d. h. in einer Zeile steht nur ein Semikolon, das hinter das Makro im Sourcecode steht) expandiert wird.
Was mache ich da falsch oder macht der gcc da etwas falsch?