在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__