2015-09-17 50 views
0

我試着這樣做:宏返回值不匹配函數類型

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_NU當然,LL作爲nullptr的作品,所以我猜它必須處理類型如何與宏一起工作?

也許我不應該使用宏來做這個,但我受到了windows系統錯誤代碼的啓發。如果這是一個壞主意,我想了解爲什麼函數調用會更好。

我也試圖這樣做,因爲我希望保持if語句返回一行,而不需要在那裏設置lastError

回答

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方法就足夠了。

+0

啊,說得通。發生這樣的事情正在發生,但我希望我仍然可以做到這一點。它是靜態函數。謝謝! – Stradigos

+0

看起來我可以使用「返回SET_ERROR_AND_RETURN_NULL(ERROR_HERE)」,儘管它現在是一個static void *類型的函數,並返回nullptr,因爲我調用的函數有其他類型的返回類型。換句話說,我的錯誤函數的void * return類型與我試圖使用它的函數不兼容,即使它正在返回nullptr,就像我可以正常使用而不使用它一樣。 – Stradigos

+0

這是因爲'void *'不能在C++中的另一個'T *'中被隱式轉換。最好的解決辦法是有像'template T * SET_ERROR_AND_RETURN_NULL(ERROR_HERE){lastError = ERROR_HERE;返回nullptr; }'這樣你就可以在任何時候擁有它,例如'return SET_ERROR_AND_RETURN_NULL (ERROR_HERE)' – Jack