Is returning void valid code?
I found out that the following code gets accepted by Visual C++ 2008 and GCC 4.3 compilers:
void foo()
{
}
void bar()
{
return foo();
}
I am a bit surprised that it compiles. Is this a language feature or is it a bug in the compilers? What do the C/C++ sta开发者_开发知识库ndards say about this?
It's a language feature of C++
C++ (ISO 14882:2003) 6.6.3/3
A return statement with an expression of type “cv void” can be used only in functions with a return type of cv void; the expression is evaluated just before the function returns to its caller.
C (ISO 9899:1999) 6.8.6.4/1
A return statement with an expression shall not appear in a function whose return type is void.
Yes, it is valid code. This is necessary when you have template functions so that you can use uniform code. For example,
template<typename T, typename P>
T f(int x, P y)
{
return g(x, y);
}
Now, g
might be overloaded to return void when the second argument is some particular type. If "returning void" were invalid, the call to f
would then break.
This is valid and can be quite useful for example to create cleaner code in situations when you want to do some error handling before returning:
void ErrRet(int code, char* msg)
{
// code logging/handling error
}
void f()
{
if (...) return ErrRet(5, "Error Message !");
// code continue
}
Valid indeed. I use it often for input validation macros:
#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());
...
}
精彩评论