我试图做一个调试系统,但它似乎不工作。
我想要实现的东西是这样的:
#ifndef DEBUG
#define printd //
#else
#define printd printf
#endif有没有办法做到这一点?我有很多调试消息,我不喜欢这样做:
if (DEBUG)
printf(...)
code
if (DEBUG)
printf(...)
...发布于 2009-11-24 02:58:19
不,你不能。在预处理指令的任何处理开始之前,注释都会从代码中删除。因此,您不能在宏中包含注释。
此外,任何试图在以后使用任何宏技巧来“形成”注释的尝试都不能保证有效。编译器不需要将"late“注释识别为注释。
实现所需功能的最佳方法是在C99中使用带有变量参数的宏(或者,也可以使用编译器扩展)。
发布于 2009-11-24 03:07:59
一个常见的技巧是这样做:
#ifdef DEBUG
#define OUTPUT(x) printf x
#else
#define OUTPUT(x)
#endif
#include <stdio.h>
int main(void)
{
OUTPUT(("%s line %i\n", __FILE__, __LINE__));
return 0;
}通过这种方式,您可以使用printf()的全部功能,但您必须忍受双括号才能使宏工作。
双括号的要点是:您需要一个集合来指示这是一个宏调用,但在C89中,宏中不能有不确定数量的参数。但是,通过将参数放在它们自己的一组括号中,它们会被解释为单个参数。在定义DEBUG的情况下展开宏时,替换文本是单词printf后跟singl参数,该参数实际上是括号中的几个项目。然后,这些括号被解释为printf函数调用中所需的括号,因此一切都解决了。
发布于 2009-11-24 03:01:41
С99方式:
#ifdef DEBUG
#define printd(...) printf(__VA_ARGS__)
#else
#define printd(...)
#endif好吧,这个不需要C99,但假设编译器已经为发布版本打开了优化:
#ifdef DEBUG
#define printd printf
#else
#define printd if (1) {} else printf
#endifhttps://stackoverflow.com/questions/1785205
复制相似问题