gpt4 book ai didi

c++ - 如何在 Matlab MEX 中使用 mexErrMsgTxt() 打印 __LINE__ 等 C 预处理器变量

转载 作者:太空宇宙 更新时间:2023-11-04 01:59:55 25 4
gpt4 key购买 nike

对于调试 Matlab-MEX 来说,这可能会很麻烦,如果有更好的断言功能就好了。正在关注this question about mex-assertions ,可以定义一个预处理器 makro,它向 Matlab 抛出一个错误并打印一个字符串(主要可以替换 mxAssert,不幸的是它会导致 Matlab2011b 崩溃)。

#define myassert( isOK,astr )      ( (isOK) ? (void)0 : (void) mexErrMsgTxt(astr) ) 

打印文件、行号和调用函数会好得多,从那里引发了以下示例断言 myassert(A=B,"A not B")! This answer对最初的问题指出它们是预处理器变量:

__LINE__,__PRETTY_FUNCTION__, __FILE__

我们如何使用 mexErrMsgTxt 打印这些预处理器变量?

问题是,mexErrMsgTxt() 采用一个 char* 参数,而不是多个输入,例如 printf(const char *format, ...)

目前我的想法仅限于此:

  1. 不可能构建函数,因为预处理器变量将具有函数的值(例如行号)。
  2. 我不可能编写一个工作的多行预处理器 makro,它从传递的 string astr 中创建一个 char 并将其传递给 mexErrMsgTxt()Maybe a solution is along these lines.
  3. 混合 解决方案,其中包含创建预处理器宏的字符和将其传递给 mexErrMsgTxt() 的函数,感觉不像是良好的编码习惯。

让指定的错误字符串成为可选的真的很好。

最佳答案

只要您仅使用 __FILE____LINE__ 和字符串文字作为消息,连接预处理器标记就可以工作。然后你可以这样写

#define STRINGIZE_I(x) #x
#define STRINGIZE(x) STRINGIZE_I(x)

#define myassert(isOK, astr) ( (isOK) ? (void)0 : (void) mexErrMsgTxt(__FILE__ ":" STRINGIZE(__LINE__) ": " astr) )

不幸的是,__PRETTY_FUNCTION__ 不是字符串文字,即使对于那些支持它的编译器也是如此。如果你想使用它(或更少的固定错误消息),你将不得不动态地组装字符串,这意味着类似于

#define myassert(isOK, astr)                                            \
do { \
if(!(isOk)) { \
std::ostringstream fmt; \
fmt << "In " << __PRETTY_FUNCTION__ << ", " \
<< __FILE__ << ":" << __LINE__ << ": " << (astr); \
(void) mexErrMsgTxt(fmt.str().c_str()); \
} \
} while(false)

对于 C,对 snprintf 做同样的事情。 (或 asprintf。它避免了固定缓冲区长度和长错误消息的问题,并且它与 __PRETTY_FUNCTION__ 一样可移植)。无论哪种方式,大致就像

#define myassert(isOK, astr)                                            \
do { \
if(!(isOk)) { \
char buf[ENOUGH_SPACE]; \
snprintf(buf, ENOUGH_SPACE, "In %s, %s:%d: %s", \
__PRETTY_FUNCTION__, __FILE__, __LINE__, (astr)); \
buf[ENOUGH_SPACE - 1] = '\0'; \
(void) mexErrMsgTxt(buf); \
} \
} while(0)

...其中必须适当定义 ENOUGH_SPACE(在 snprintf 情况下)。

关于c++ - 如何在 Matlab MEX 中使用 mexErrMsgTxt() 打印 __LINE__ 等 C 预处理器变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28630530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com