我目前正在用C开发一个单元测试库,我想添加一个功能Catch(在C ++中)有。
当你这样做时,使用Catch:
int x = 5;
REQUIRE(x == 4);
输出将是这样的:
Failed statement : x == 4
evaluated as 5 == 4
是否有可能在C中做类似的事情? 这需要在运行时完成。
答案 0 :(得分:0)
你可以这样做。这不太方便,但它有效:
#include <stdio.h>
#include <stdlib.h>
#define ASSERT_INT 1
#define ASSERT_EQ(x,y,type) do { if((x)!=(y)) { \
switch(type) { \
case ASSERT_INT: \
printf("Failed statement : %s == %d\n\tevaluated as %d == %d\n", \
#x, (y),(x), (y)); break; \
} exit(EXIT_FAILURE); }} while(0)
虽然需要一些工作。如果你想要很多操作,你可以这样做:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ASSERT_INT 1
#define ASSERT_EQ 1
#define ASSERT(x,y,op,type) do { \
int success; \
char op_str[3]; \
switch(op) { \
case ASSERT_EQ: \
strcpy(op_str, "==");success = ((x) == (y)); break; \
} \
if(!success) { \
switch(type) { \
case ASSERT_INT: \
printf("Failed statement : %s %s %d\n\tevaluated as %d %s %d\n", \
#x, op_str, (y),(x), op_str, (y)); break; \
} exit(EXIT_FAILURE); }} while(0)
输出:
$ ./a.out
Failed statement : x == 4
evaluated as 5 == 4
您需要为每个不同的逻辑操作添加strcpy(op_str, "==");success = ((x) == (y)); break;
的修改版本,并为每个不同的类型添加printf("Failed statement : %s %s %d\n\tevaluated as %d %s %d\n", #x, op_str, (y),(x), op_str, (y)); break;
的修改版本。