如何在C中使用宏来评估表达式的一部分?

时间:2018-01-05 11:48:35

标签: c macros

我目前正在用C开发一个单元测试库,我想添加一个功能Catch(在C ++中)有。
当你这样做时,使用Catch:

int x = 5;
REQUIRE(x == 4);

输出将是这样的:

Failed statement : x == 4
     evaluated as 5 == 4

是否有可能在C中做类似的事情? 这需要在运行时完成。

1 个答案:

答案 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;的修改版本。