我正在尝试做类似的事情:
if (foo)
return SET_ERROR_AND_RETURN_NULL(ERROR_HERE);
...使用
#define SET_ERROR_AND_RETURN_NULL(error)
lastError = error; \
return nullptr; \
所以以后我可以......
if (GetMyLastError() == ERROR_HERE) { foo }
然而,我得到"Return value type does not match the function type."
只是将SET_ERROR_AND_RETURN_NULL定义为nullptr当然是有效的,所以我猜它与类型如何与宏一起工作有什么作用?
也许我不应该使用宏来做这件事,但我受到了Windows系统错误代码的启发。如果这是一个坏主意,我想了解为什么函数调用会更好。
我也试图这样做,因为我希望保持if语句返回单行,而不需要在那里设置lastError
。
答案 0 :(得分:2)
文字替换显示错误。
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_HERE
将返回错误(因为=
运算符的返回值),这可能不是您方法的返回类型。它是一个宏,而不是一个函数,因此它在文本上被替换:如果从宏返回,则直接从扩展宏的代码返回。
这就是为什么你不能在不使用它们时使用它们,这里static
方法已经足够了。