标准c++ assert()是如何工作的,以及如何重新定义它



assert.h中我们可以看到

# define assert(__e) ((__e) ? (void)0 : __assert_func (__FILE__, __LINE__, 
                               __ASSERT_FUNC, #__e))

因为目标是嵌入的,所以我需要在断言失败时实际显示错误消息,所以我需要调用LCD写入函数。我尝试了以下操作:

void handleCriticalError(int err_num, char *fname, int line_num, const char *foo); // Halts the program!
#define ASSERT(__e) ((__e) ? (void)0 : handleCriticalError (0, __FILE__, __LINE__, __func__))

然而,当我使用它时,我得到一个奇怪的错误。

ASSERT(1<2);
>error: deprecated conversion from string constant to 'char*' [-Werror=write-strings]

如何将函数绑定到自定义断言或标准断言,以便在失败的断言时调用函数?

注意,我不需要这里讨论的功能齐全、符合标准的assert。我只打算将它作为一行中的单个语句使用,并对变量或常量进行简单的比较。

文件名可能是一个字符串常量(const char*),但是您的函数接受char*参数。此不匹配导致错误。

如果将函数参数声明为const char *fname,则错误将消失。

重新定义你的函数:

void handleCriticalError(int err_num, char const *fname, int line_num, const char *foo);

注意const *fname参数应该接受__FILE__

相关内容

  • 没有找到相关文章

最新更新