如何在C++中定义宏函数返回void或else
how to define macro function returns void or else in C++
我定义了以下两个函数宏来检查线程类中的退出标志
//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
的返回语句只能在返回类型为cv
void
的函数中使用;就在函数返回到调用方之前,对表达式进行求值。
创建一个隐式转换为void
的类型似乎很自然。不幸的是,表达式具有此自定义类型,该类型被视为非void类型,因此被拒绝。
struct does_not_work
{
operator void() const {}
template<typename T> operator T() const { return T{}; }
};
我不确定我是否支持重新编写规则,以允许隐式转换为返回类型的类型,即使该返回类型为void。
同样,这也被拒绝:
return {};
(但void{}
也是(
相关文章:
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 接收和返回函数指针的函数指针的类型?
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- C++函数链返回函数
- 返回函数指针的函数的签名
- 由于值返回函数中的错误,程序无法编译.它说未声明的标识符
- 非常量引用返回函数在常量值返回函数上用作 r 值
- 如何在 C++ 中从 void 返回函数访问变量
- 返回函数中带有 2 个可选 ctor 的对象
- 如何在 c++ 中返回函数的结构向量
- 返回 C++ 函数中的引用
- 使用向量时,当返回函数更改时,无法看到输出
- 如何在递归中使用返回函数
- 返回函数模板的类型C++作为第二个模板参数
- 为什么静态指针返回函数中有一个"静态"键?
- 递归返回函数,在特殊情况下不返回
- 从类返回函数
- 从类成员函数返回函数指针
- 从返回函数中推断不存在的模板参数