C++ 如何在C+中定义宏函数返回void或else+;
C++ 如何在C+中定义宏函数返回void或else+;,c++,macros,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;\ }\ 我必须分别定义它们,因为返回值不
我定义了以下两个函数宏来检查线程类中的退出标志。
//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;\
}\
我必须分别定义它们,因为返回值不同。我可以在一个宏中定义它吗?
我在谷歌上搜索,但找不到答案。
谢谢您的建议。我不确定如何“在一个宏中”为不同类型的函数执行此操作,除非您选择从外部指定实际返回值
如果你不介意这样做,那么你可以利用C++中的事实(而不是C),你可以从空虚函数中返回空表达式。例如,可以将
(void)0
作为“void”值返回。也就是说,你能做到
#define CHECK_EXIT_IN_FUNC(ret) if( exitFlag_ ) {\
//do something\
return (ret);\
}
并根据函数的类型将其调用为
CHECK\u EXIT\u IN_FUNC(false)
或CHECK\u EXIT\u IN_FUNC((void)0)
。您可以使用可变宏。如果你不想在检查后归还任何东西,请不要交任何东西
#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扩展(
###u_uva_ARGS_u
)来删除尾随逗号。如果您使用的编译器不理解此GCC扩展,请使用完整版本。返回类型的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{}
)看起来有点像XY问题。我会考虑使用模板函数/类来解决(任何问题),而不是预处理宏。你是对的。我知道XY问题是什么意思。也许我的问题就是其中之一……哇。。看起来有点难,但我要试试这个。例如,谢谢你。VA_参数来自哪里?@SpicyWeenie:编译器。
return {};