我發現下面的代碼被採用Visual C++ 2008和GCC 4.3編譯器接受:返回無效的有效代碼?
void foo()
{
}
void bar()
{
return foo();
}
我有點驚訝的是它編譯。這是一種語言功能還是它在編譯器中的錯誤? C/C++標準對此有何評論?
我發現下面的代碼被採用Visual C++ 2008和GCC 4.3編譯器接受:返回無效的有效代碼?
void foo()
{
}
void bar()
{
return foo();
}
我有點驚訝的是它編譯。這是一種語言功能還是它在編譯器中的錯誤? C/C++標準對此有何評論?
它的C++
C++語言特徵(ISO 14882:2003)6.6.3/3
,類型爲「CV空隙」的表達式的return語句可以在功能僅用於用cv void返回類型;該表達式在函數返回給調用者之前被評估。
C(ISO 9899:1999)6.8.6.4/1
帶表達式的return語句不得出現在返回類型 是無效的功能。
是的,它是有效的代碼。當您有模板功能時,這是必要的,以便您可以使用統一代碼。例如,
template<typename T, typename P>
T f(int x, P y)
{
return g(x, y);
}
現在,g
可能被重載以在第二個參數是某種特定類型時返回void。如果「返回無效」無效,則f
的呼叫將會中斷。
這是有效的,可以是非常有用的,例如當你想在返回前做一些錯誤處理創建情況更清晰的代碼:確實
void ErrRet(int code, char* msg)
{
// code logging/handling error
}
void f()
{
if (...) return ErrRet(5, "Error Message !");
// code continue
}
有效。我用它經常輸入驗證宏:
#define ASSERT_AND_RETURN_IF_NULL(p,r) if (!p) { assert(p && "#p must not be null"); return r; }
bool func1(void* p) {
ASSERT_AND_RETURN_IF_NULL(p, false);
...
}
void func2(void* p) {
ASSERT_AND_RETURN_IF_NULL(p, void());
...
}
注意,許多編譯器可以編譯C和C++將提供C++規則作爲非標準擴展在編譯的C代碼,但是這不應該依賴如果你想要便攜。 – 2017-03-13 20:04:44