【问题标题】:use macro to test function return value in C使用宏测试C中的函数返回值
【发布时间】:2020-02-17 04:22:40
【问题描述】:

我想要一个宏,它可以执行以下操作:

#define TEST(_ptr) ({ if ((_ptr) == NULL) ERROR; (_ptr); })

检查_ptr 并调用ERROR 宏或返回其值。

但是,如果我使用 var = TEST(fun()) 之类的东西,这会导致 fun() 被调用两次。

我可以这样做:

#define TEST(_tmp, _ptr) ({ _tmp = _ptr; if ((_tmp) == NULL) ERROR; (_tmp); })

是否有任何干净的方法可以在不通过临时存储的情况下执行此操作,例如使用typeof 运算符!?

【问题讨论】:

  • 请注意,expression statements 是标准 C 的 GCC 扩展,typeof 运算符也是如此。只要您意识到您正在创建的可移植性问题,就可以使用它们。
  • 使用8字节的临时存储有什么问题?您的机器没有那么拥挤的内存。

标签: c gcc macros


【解决方案1】:

与其使用宏定义,不如使用常规函数,如下所示:

void *funcCaller (void *f) {
    if (f == NULL) {
        ERROR;    // not sure what the ERROR thing is supposed to do or look like.
    }

    return f;
}

然后调用它:

p = funcCaller (func());

由于funcCaller() 的参数列表使用void *,因此func() 的返回类型可以是任何指针类型。

【讨论】:

    【解决方案2】:

    你可以这样做:

    /* Assuming your ERROR, something like this */
    #define ERROR \
    ({ \
        printf("Error, Null pointer passed\n"); \
        exit(1); \
    })
    
    #define TEST1(_ptr) \
    ({ \
        typeof(_ptr) _tmp = _ptr; \
        if ((_tmp) == NULL) ERROR; \
        (_tmp); \
    })
    

    【讨论】:

      【解决方案3】:

      通过比较 (_ptr) == NULL 我假设您的 func() 返回一个指针。 在这种情况下,您可以将 TEST(_ptr) 宏更改为:

      #define TEST(_ptr) ({ void* _rt = _ptr; if ((_rt) == NULL) ERROR; (_rt); })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-04
        • 1970-01-01
        • 2018-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-11
        • 1970-01-01
        相关资源
        最近更新 更多