digitalmars.D.learn - log library: macro replacement in D
- Ben Gardner (44/44) Apr 01 2006 Hi,
- Victor Nakoryakov (8/21) Apr 02 2006 No, you would not. When you will compile with -inline I guess such
Hi, I am trying to port a simple log library from C to D. This library enables me to easily turn on and off printf() statements at runtime. The important functionality is reduced to the following: //// logger.h extern int gl_log_sev_mask; static inline int log_active(int sev) { return gl_log_sev_mask & (1 << sev); } enum { LSYS = 0, LERR = 1, LWARN = 2, }; #define LOG(sev, args...) \ //// end logger.h So, this statement: LOG(LWARN, "missing symbol: %s\n", symbol); gets compiled into: if (gl_log_sev_mask & 4) { printf("missing symbol: %s\n", symbol); } The key features here: - no functions are called if the log severity is turned off - the variable LOG() parameters are not evaluated unless needed So how do I do this in D? In particular, there are two main questions: 1. How do I do inline functions? 2. How do I replace the LOG macro? I know I could brute force it: void LOG(int sev, ...) { if ((gl_log_mask & (1 << sev)) == 0) return; ... do printf stuff ... } But then I lose the efficiency of the macro approach. Any ideas? Thanks, Ben
Apr 01 2006
Ben Gardner wrote: > I know I could brute force it:void LOG(int sev, ...) { if ((gl_log_mask & (1 << sev)) == 0) return; ... do printf stuff ... } But then I lose the efficiency of the macro approach.No, you would not. When you will compile with -inline I guess such trivial function will be inlined.Any ideas? Thanks, Ben-- Victor (aka nail) Nakoryakov nail-mail<at>mail<dot>ru Krasnoznamensk, Moscow, Russia
Apr 02 2006