C++ nullptr类型的宏返回值与函数类型不匹配
我试着做一些类似的事情:C++ nullptr类型的宏返回值与函数类型不匹配,c++,C++,我试着做一些类似的事情: if (foo) return SET_ERROR_AND_RETURN_NULL(ERROR_HERE); 使用 #define SET_ERROR_AND_RETURN_NULL(error) lastError = error; \ return nullptr; \ 这样以后我就可以 if(getmylastror()==ERROR_此处){foo} 但是,我得到了“返回值类型与函数类型不匹配。”只是将SET\u ERROR\
if (foo)
return SET_ERROR_AND_RETURN_NULL(ERROR_HERE);
使用
#define SET_ERROR_AND_RETURN_NULL(error)
lastError = error; \
return nullptr; \
这样以后我就可以
if(getmylastror()==ERROR_此处){foo}
但是,我得到了“返回值类型与函数类型不匹配。”
只是将SET\u ERROR\u和\u Return\u NULL定义为NULL ptr当然有效,所以我猜这与类型如何与宏一起工作有关
也许我不应该使用宏来实现这一点,但我受到了windows系统错误代码的启发。如果这是个坏主意,我想了解为什么函数调用会更好
我也尝试这样做,因为我希望if语句返回一行,而不需要在那里设置
lastError
。文本替换显示错误
if (foo)
return SET_ERROR_AND_RETURN_NULL(ERROR_HERE);
变成:
if (foo)
return lastError = ERROR_HERE;
return nullptr;
它被解析为
if (foo)
return lastError = ERROR_HERE;
return nullptr;
现在return lastError=ERROR\u此处
将返回错误(因为=
运算符的返回值),这可能不是方法的返回类型。它是一个宏,而不是函数,因此被文本替换:如果从宏返回,则直接从展开宏的代码返回
这就是为什么当你可以避免使用它们时,你不应该使用它们,在这里,一个
静态的方法就足够了。啊,很有意义。我以为会发生这样的事,但我希望我还能做到。它是静态函数。谢谢看起来我不能使用“return SET_ERROR_和_return_NULL(ERROR_HERE)”,尽管它现在是一个类型为static void*并返回NULL ptr的函数,因为我在其中调用的函数具有其他类型的返回。换句话说,我的错误函数的空洞*类型与我试图使用它的函数不兼容,即使它返回Null pTR,就像我通常可以不用它一样。这是因为在C++中,<代码> Value*/Cux>不能在另一个<代码> T*<代码>中隐式转换。最好的解决方案是使用template T*SET\u ERROR\u和_RETURN\u NULL(这里是ERROR\u){lastError=ERROR\u这里是;RETURN nullptr;}
这样您就可以随时使用它,例如RETURN SET\u ERROR\u和_RETURN\u NULL(这里是ERROR\u)