C:宏中的预处理器?

发布于 2024-11-06 02:30:48 字数 284 浏览 0 评论 0原文

有没有办法在宏内部使用预处理器关键字?如果有某种转义字符或其他什么,我不知道。

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

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

从此:

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

这可能吗,或者我只是疯了(每次我想显示调试消息时我都必须输入预处理器条件)?

Is there a way to use preprocessor keywords inside of a macro? If there is some sort of escape character or something, I am not aware of it.

For example, I want to make a macro that expands to this:

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

from this:

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

Is this possible, or am I just crazy (and I will have to type out the preprocessor conditional every time I want to show a debug message)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

英雄似剑 2024-11-13 02:30:48

您不能直接执行此操作,但您可以根据是否定义了 DEBUG 来以不同方式定义 PRINT 宏:

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

You can't do that directly, no, but you can define the PRINT macro differently depending on whether DEBUG is defined:

#ifdef DEBUG
    #define PRINT(...) printf(__VA_ARGS__)
#else 
    #define PRINT(...) log(__VA_ARGS__)
#endif
萧瑟寒风 2024-11-13 02:30:48

反过来做就可以了:

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

Just do it the other way around:

#ifdef DEBUG
    #define PRINT printf
#else
    #define PRINT log
#endif
别闹i 2024-11-13 02:30:48

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

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

如果您有可变参数宏,则可以执行 #define DEBUG_PRINTF(...) func(__VA_ARGS__) 相反。无论哪种方式都有效。第二个允许您使用函数指针,但我无法想象为什么您需要它来达到此目的。

You're not crazy, but you're approaching this from the wrong angle. You can't have a macro expand to have more preprocessor arguments, but you can conditionally define a macro based on preprocessor arguments:

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

If you have variadic macros, you could do #define DEBUG_PRINTF(...) func(__VA_ARGS__) instead. Either way works. The second lets you use function pointers, but I can't imagine why you'd need that for this purpose.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文