我有宏:
#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,...)
DEBUG
时2
打印调试消息,1
时反之? }?
我想要这样的东西::
#if defined DEBUG && DEBUG
# define D(type,...) if DEBUG&type THEN printf(__VA_ARGS__) else do nothing
#else
# define D(...)
#endif
答案 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");)