如何根据宏观价值定义宏观基础?

时间:2018-01-24 17:01:35

标签: c macros c-preprocessor

我有宏:

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

DEBUG具有TRUE值时,哪些内容无效。

但现在我想提供TYPE的东西。这将显示调试类型:

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

有没有办法定义这样的宏,D(1,..)什么也不做,D(2,...) DEBUG2打印调试消息,1时反之? }?

我想要这样的东西::

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

3 个答案:

答案 0 :(得分:2)

好吧,它不会在预处理时进行真正的计算,但如果类型是编译时常量,仍然是在编译类型。

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

上述至少需要C99。

答案 1 :(得分:1)

你可以这样做;

#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");
}

答案 2 :(得分:0)

这并没有解决问题,但让我更接近。也许这对某人有用:

#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");)

指向技巧的链接:firstsecond。第二个链接更有趣,因为它描述了逐步发生的事情