简体   繁体   中英

How to define macro bases on macro value?

I have macros:

#if defined DEBUG  &&  DEBUG
#  define D(...) printf(__VA_ARGS__)
#else
#  define D(...)
#endif

Which effectively do nothing when DEBUG has TRUE value.

But now I want to provide the TYPE thing. Which will show the type of debugging:

D( 1, "some string" );
D( 2, "another thing" );

Is there a way to define such macros which will do nothing for D(1,..) and print debug messages for D(2,...) when DEBUG is 2 and viceversa when 1 ?

I wanna something like this::

#if defined DEBUG  &&  DEBUG
#  define D(type,...) if DEBUG&type THEN printf(__VA_ARGS__) else do nothing
#else
#  define D(...)
#endif

Well, it won't be truely evaluated at preprocessing time, but if the type is a compile-time-constant, still at compile-type.

#define D(type, ...) (void)((type & DEBUG) && fprintf(stderr, __VA_ARGS__))

The above needs at least C99 though.

You can do it like this;

#if defined DEBUG  
#  define P1(...) 
#  define P2(...) printf(__VA_ARGS__)
#  define D(n, ...) P##n(__VA_ARGS__)
#else
#  define D(...)
#endif

main()
{
    D(1, "Test");
    D(2, "Test2");
}

This did not resolve the problem but take me closer. Maybe it will be useful for someone:

#define _CAT(a, ...) a ## __VA_ARGS__

#define CHECK(...) SECOND(__VA_ARGS__, 0)
#define SECOND(x, n, ...) n

#define _NOT_0 _TRUE()
#define _TRUE() ~, 1

#define BOOL(x) NOT(NOT(x))
#define NOT(x) CHECK(_CAT(_NOT_, x))

#define IF(cond) _IF(BOOL(cond))
#define _IF(cond) _CAT(_IF_, cond)
#define _IF_1(...) __VA_ARGS__
#define _IF_0(...)

IF(1)(printf("YES\n");)
IF(0)(printf("NO\n");)

Links to tricks: first and second . Second link is more interesting because it describes what is coming on step-by-step

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM