如何定义宏函数返回void或者在C ++中返回

时间:2014-08-07 00:34:12

标签: c++ macros


我定义了以下两个函数宏来检查我的线程类中的退出标志。

//use this in run()
#define CHECK_EXIT  if( exitFlag_ ) {\
    //do something\
    return;\
}\

//use this in function
#define CHECK_EXIT_IN_FUNC  if( exitFlag_ ) {\
    //do something\
    return false;\
}\

我必须单独定义它们,因为返回值不同 我可以在一个宏中定义它吗? 我用Google搜索,但找不到答案 谢谢你的任何建议。

3 个答案:

答案 0 :(得分:4)

您可以使用可变参数宏。如果您不想在支票后退回任何东西,请不要传递任何内容。

#define CHECK_EXIT(...) CHECK_EXIT_(_, ##__VA_ARGS__)
#define CHECK_EXIT_(...) CHECK_EXIT_X(__VA_ARGS__, _1, _0)(__VA_ARGS__)
#define CHECK_EXIT_X(_0, _1, X, ...) CHECK_EXIT ## X
#define CHECK_EXIT_0(_) do if (exit_flag_) { /*...*/ return; } while(0)
#define CHECK_EXIT_1(_, R) do if (exit_flag_) { /*...*/ return (R); } while(0)

void test_0 () {
    bool exit_flag_ = true;
    CHECK_EXIT();
}

int test_1 () {
    bool exit_flag_ = true;
    CHECK_EXIT(0);
    return 1;
}

我使用different answer中描述的非常简化版本的参数计数技巧。我能够简化它,因为如果变量参数扩展为空,我依赖GCC扩展(##__VA_ARGS__)来删除尾随逗号。如果您没有使用了解此GCC扩展的编译器,请使用完整版本。

答案 1 :(得分:3)

我不确定如何在“一个宏”中为不同类型的函数执行此操作,除非您选择从外部指定实际返回值。

如果您不介意这样做,那么您可以利用在C ++中(但不在C中)可以从void函数返回void表达式的事实。例如,您可以将(void) 0作为“void”值返回。即你可以做到

#define CHECK_EXIT_IN_FUNC(ret)  if( exitFlag_ ) {\
    //do something\
    return (ret);\
}

并根据函数的类型将其作为CHECK_EXIT_IN_FUNC(false)CHECK_EXIT_IN_FUNC((void) 0)调用。

答案 2 :(得分:3)

返回类型的C ++ 11规则创建了一些有趣的案例:

  

表达式为非void类型的return语句只能在返回值的函数中使用;表达式的值返回给函数的调用者。表达式的值隐式转换为它出现的函数的返回类型。

以后

  

表达式为void的return语句只能用于返回类型为 cv void的函数中;在函数返回其调用者之前计算表达式。

创建一个隐式转换为void的类型似乎很自然。不幸的是,表达式具有这种自定义类型,它被视为非void类型,并被拒绝。

struct does_not_work
{
    operator void() const {}
    template<typename T> operator T() const { return T{}; }
};

我不确定是否支持重写规则以允许隐式转换为返回类型的类型,即使返回类型为void。

同样,这被拒绝了:

return {};

(但void{}

也是如此