Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Return void type in C and C++

This compiles without any warnings.

Is this legal in C and C++ or does it just work in gcc and clang?

If it is legal, is it some new thing after C99?

void f(){  }  void f2(){     return f(); } 

Update

as "Rad Lexus" suggested I tried this:

$ gcc -Wall -Wpedantic -c x.c  x.c: In function ‘f2’: x.c:7:9: warning: ISO C forbids ‘return’ with expression, in function returning void [-Wpedantic]   return f(); 

$ clang -Wall -Wpedantic -c x.c  x.c:7:2: warning: void function 'f2' should not return void expression [-Wpedantic]         return f();         ^      ~~~~~ 1 warning generated. 

$ gcc -Wall -Wpedantic -c x.cc (no errors) 

$ clang -Wall -Wpedantic -c x.cc (no errors) 

Update

Someone asked how this construction is helping. Well is more or less syntactic sugar. Here is one good example:

void error_report(const char *s){     printf("Error %s\n", s);     exit(0); }  void process(){    if (step1() == 0)       return error_report("Step 1");     switch(step2()){    case 0: return error_report("Step 2 - No Memory");    case 1: return error_report("Step 2 - Internal Error");    }     printf("Processing Done!\n"); } 
like image 666
Nick Avatar asked Mar 14 '16 12:03

Nick


People also ask

Can you return void in C?

Yes, you can return from a void function.

What is the return type of a void method?

Any method declared void doesn't return a value. It does not need to contain a return statement, but it may do so.

What is return type in C?

Return Type − A function may return a value. The return_type is the data type of the value the function returns. Some functions perform the desired operations without returning a value. In this case, the return_type is the keyword void. Function Name − This is the actual name of the function.

Is void data type in C?

Yes, void is a type.


2 Answers

C11, 6.8.6.4 "The return statement":

A return statement with an expression shall not appear in a function whose return type is void.

No, you may not use an expression, even if it is of void type.

From the foreword of the same document:

Major changes in the second edition included:

[...]

  • return without expression not permitted in function that returns a value (and vice versa)

So this was a change from C89 -> C99 (the second edition of the language standard), and has been that way ever since.


C++14, 6.6.3 "The return statement":

A return statement with an expression of non-void type can be used only in functions returning a value [...] A return statement with an expression of type 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.

Yes, you may use an expression if it is of void type (that's been valid since C++98).

like image 109
DevSolar Avatar answered Sep 27 '22 17:09

DevSolar


This code is allowed in C++ but not allowed in C

From Return statement @ cppreference

In a function returning void, the return statement with expression can be used, if the expression type is void.


OTOH in C11 specs draft n1570:

Major changes in the second edition included:

return without expression not permitted in function that returns a value (and vice versa)

(return with expression not permitted in function that returns a void)

and 6.8.6.4 return

A return statement with an expression shall not appear in a function whose return type is void. A return statement without an expression shall only appear in a function whose return type is void.

(even if the expression evaluates to void)

like image 44
Mohit Jain Avatar answered Sep 27 '22 17:09

Mohit Jain