【问题标题】:Preproccessed printf function预处理的 printf 函数
【发布时间】:2013-08-23 19:54:23
【问题描述】:

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

  • 不污染代码(最多可调用一行)。
  • 如果指定的预处理器条件被证明不正确,则编译掉。

问题是,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 的引用。

【问题讨论】:

  • PRINTF(("any int %d", i)) 这样的东西怎么样?

标签: c macros opencl


【解决方案1】:

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

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

并将其用作

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

多亏了双括号,它不是可变参数宏。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • OpenCL 不支持可变参数函数或可变参数宏。 printf 是一个例外。
    猜你喜欢
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 2021-05-09
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多