Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C+中定义宏函数返回void或else+;_C++_Macros - Fatal编程技术网

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