1

我正在尝试在 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 的引用。

4

2 回答 2

1

正如 Kerrek SB 在他的评论中已经建议的那样:

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

并将其用作

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

由于双括号,它不是可变参数宏。

于 2013-08-23T11:54:23.713 回答
0

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

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

这会导致额外的函数调用而不是宏(尽管它可能可以被内联),但这并不重要,因为它只发生在您调用调试语句时(所以谁关心性能呢)

于 2013-08-23T11:41:19.743 回答