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