Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/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++ nullptr类型的宏返回值与函数类型不匹配_C++ - Fatal编程技术网

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)