【问题标题】:suppressing mexPrintf in matlab mex code在 matlab mex 代码中抑制 mexPrintf
【发布时间】:2012-10-18 23:10:35
【问题描述】:

我有从我的 matlab 脚本调用的 mex 代码。为了调试代码,我放了很多 mexPrintf 语句,但现在出于计时目的,我不希望在 mex 代码调用中发生任何 I/O(因为 I/O 需要很多时间)。在我的代码中抑制 mexPrintf 调用的最简单和最好的方法是什么,以便根本不执行这些语句,而不必删除/注释掉这些语句? (我不想删除/注释掉这些语句并重新编译我的 mex 代码,因为我以后可能需要这些调试语句,并且我不想继续一遍又一遍地修改和构建我的代码) .

是否有任何编译器开关可以解决问题?还是一些预处理器语句?

谢谢!

【问题讨论】:

    标签: c++ matlab io printf mex


    【解决方案1】:

    您不能关闭mexPrintf。您需要修改您的代码。定义例如DEBUG 标志来决定什么时候要打印,什么时候不打印。比如用普通的printf函数

    #include <stdio.h>
    #include <stdlib.h>
    
    //#define DEBUG
    #ifdef DEBUG
    #define MPRINT(...) printf(__VA_ARGS__);
    #else
    #define MPRINT(...)
    #endif
    
    int main()
    {
      MPRINT("%d\n", 5);
    }
    

    如果您现在运行它,则不会打印任何内容。但是,如果您取消注释 #define DEBUG 语句,则会打印 5 个。

    或者,您可以在此类子句中包含所有 mexPrintf 调用:

    #ifdef DEBUG
    mexPrintf(...);
    #endif
    

    同样,如果未定义 DEBUG,则不会打印任何内容。但这还有很多工作要做。

    您也可以通过使用普通的if 语句并将verbose 参数传递给mex 文件来执行类似的操作,而无需重新编译您的mex 文件。但是,如果您过于频繁地执行if 语句,这仍然会对性能产生一些影响。所以去DEBUG more - 这是标准的方式。

    【讨论】:

    • +1 "#define DEBUG" 将是在 C 中执行此操作的经典方式,但使用运行时 verbose 标志可能会更“标准”Matlab 风格,所以你每次更改时不必重新编译 MEX。与函数中正在执行的任何 M 工作相比,额外的 C 函数调用和if 检查的成本将是微不足道的。您可以添加一个特殊的mymexfunction('debug','on') 调用表单和static 详细变量来全局打开或关闭调试输出,因此您不必在每个函数调用站点传递verbose 标志。
    • @AndrewJanke True。嗯,我通常把这些结合起来。对于真正无趣的调试信息,我使用ifdef。对于一些有用的时间信息或模型信息,我使用verbose 标志。
    • 酷。我最终倾向于另一种方式:对所有内容进行精细的运行时配置。在之前的项目中,我们在 Java SLF4J 日志记录的基础上构建了一个 Matlab 日志记录框架,它非常有用,以至于我现在偏向于这种调试输出风格。 (特别是对于部署到其他用户或服务器端的大型项目,因此您可以在不重新部署的情况下进行调试。)所以我会在所有运行时测试中这样做,使用int verbose 来定义多个详细级别,而不仅仅是在/离开。 YMMV。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 2014-06-09
    相关资源
    最近更新 更多