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

how to define macro function returns void or else in C++

本文关键字:返回 函数 void else 定义 C++      更新时间:2023-10-16


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

//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;
}

我不得不分别定义它们,因为返回值不同
我可以在一个宏中定义它吗
我在谷歌上搜索,但找不到答案
谢谢你的建议。

您可以使用可变宏。如果您在检查后不想归还任何东西,请不要传递任何信息。

#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;
}

我使用了一个非常简化的版本,在另一个答案中描述了论点计数技巧。我能够简化它,因为如果变量自变量扩展为空,我依赖GCC扩展(##__VA_ARGS__(来删除尾部逗号。如果您没有使用理解此GCC扩展的编译器,请使用完整版本。

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

如果您不介意这样做,那么您可以利用这样一个事实,即在C++中(而不是在C中(,您可以从void函数返回void表达式。例如,可以将(void) 0作为"void"值返回。也就是说,你可以做

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

并根据函数的类型将其调用为CCD_ 3或CCD_。

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

带有非void类型表达式的return语句只能在返回值的函数中使用;表达式的值将返回给函数的调用方。表达式的值将隐式转换为它所在函数的返回类型。

以及后来的

表达式类型为void的返回语句只能在返回类型为cvvoid的函数中使用;就在函数返回到调用方之前,对表达式进行求值。

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

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

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

同样,这也被拒绝:

return {};

(但void{}也是(