标准C ++ assert()如何工作以及如何重新定义它?

时间:2014-06-12 12:12:03

标签: c++ gcc 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]

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

请注意,我不需要按照here讨论的全功能,标准的assert。我将仅将其用作一行上的单个语句,并对变量或常量进行简单比较。

2 个答案:

答案 0 :(得分:3)

文件名可能是字符串常量(const char*),但您的函数采用char*参数。这种不匹配会导致错误。

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

答案 1 :(得分:2)

重新定义你的功能:

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

note const *fname参数应该接受__FILE__