C:宏中的预处理器?

3

有没有一种方法可以在宏中使用预处理器关键字?如果有某种转义字符或其他东西,我不知道。

例如,我想制作一个宏,使其扩展为以下内容:

#ifdef DEBUG
    printf("FOO%s","BAR");
#else
    log("FOO%s","BAR");
#endif

从这里开始:

PRINT("FOO%s","BAR");

这种做法可行吗,还是我太疯狂了(每次想要显示调试信息都必须手动输入预处理器条件)?

3个回答

6

直接这样做是不行的,但是你可以根据是否定义了DEBUG来不同地定义PRINT宏:

#ifdef DEBUG
    #define PRINT(...) printf(__VA_ARGS__)
#else 
    #define PRINT(...) log(__VA_ARGS__)
#endif

啊,我知道它一定有可能,但我只是看错了方向。谢谢你。 - Matt Bell
@James McNellis:这会产生一个错误,PRINT("FOO%s","BAR")会被展开为log("FOO%s","BAR");,例如。 - orlp
1
@equality: C89/90没有可变参数宏。 - James McNellis
1
@nightcracker - 虽然不太美观,但这并不是错误。 - Chris Lutz
@nightcracker:我已经注意到了并删除了多余的; - James McNellis
显示剩余2条评论

2

换个方向来做:

#ifdef DEBUG
    #define PRINT printf
#else
    #define PRINT log
#endif

0

你并不疯狂,但你从错误的角度来看待这个问题。你不能让宏扩展成更多的预处理器参数,但你可以根据预处理器参数有条件地定义一个宏:

#ifdef DEBUG
# define DEBUG_PRINT printf
#else
# define DEBUG_PRINT log
#endif

如果您有可变参数宏,可以使用#define DEBUG_PRINTF(...) func(__VA_ARGS__)。两种方法都可以。第二种方法允许您使用函数指针,但我无法想象为什么您需要这样做。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接