预处理的printf功能

时间:2013-08-23 11:27:37

标签: c macros opencl

我正在尝试在OpenCL内核中创建透明的调试prtinf函数:

  • 不要污染代码(可以从最多一行调用)。
  • 如果指定的预处理器条件证明是不真实的,请编译。

问题是,printf是一个可变参数函数,我不能将它包装在一个可变参数宏中,因为OpenCL内核语言(C99衍生物)不支持可变参数宏。

#if DEBUG_CONDITION
printf("Any int %d\n",i);
#endif

可行,但会快速呈现代码不可读。

if(DEBUG_CONDITION) printf("Any int %d\n",i);

这也可以,但是需要我启用printf pragma,因为函数需要实际在代码中被引用,即使我知道它们将被编译掉。 (从OpenCL 2.0开始,printf将定义同步属性,并且无法确定在实际删除函数之前是否将同步语义引入二进制文件。)

PRINTF("Any int %d\n",i);

我正在寻找看起来不错的这类(或类似的),但完全可以完全忽略对prtintf的引用。

2 个答案:

答案 0 :(得分:1)

正如Kerrek SB在他的评论中已经提出的那样:

#if DEBUG_CONDITION
#define PRINTF(args)  printf args
#else
#define PRINTF(args)
#fi

并将其用作

PRINTF(("Debugging i: %d", i ));

由于双重禁忌,它不是可变的宏。

答案 1 :(得分:0)

如果你不能使用可变参数宏那么为什么不使用可变参数函数(这是C标准的一部分)

#ifdef NDEBUG
inline int debug_print(char *fmt, ...)
{}
#else
int debug_print(char *fmt, ...)
{
     /* implement this I'm too lazy */
}
#endif

这导致额外的函数调用而不是宏(尽管它可能是内联的)但这应该无关紧要,因为它只发生在调用调试语句时(那么谁关心性能)< / p>