我定义了以下两个函数宏来检查我的线程类中的退出标志。
//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搜索,但找不到答案 谢谢你的任何建议。
答案 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{}
)