Return void type in C and C++

前端 未结 5 1375
我在风中等你
我在风中等你 2020-12-08 13:11

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?

相关标签:
5条回答
  • 2020-12-08 13:36

    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)

    0 讨论(0)
  • 2020-12-08 13:38

    ISO/IEC 9899:201x Committee draft says the following:

    6.8.6.4 The return statement

    Constraints

    1. 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.

    So, it is forbidden in C.


    You need to use -pedantic switch to gcc for it to complain about standard violations:

    test.c: In function ‘f2’:
    test.c:6:12: warning: ISO C forbids ‘return’ with expression, in function returning void 
                [-Wpedantic]
         return f();
    
    0 讨论(0)
  • 2020-12-08 13:43

    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).

    0 讨论(0)
  • 2020-12-08 13:59

    C++ allows something like that:

    void f() 
    {
        return void();
    }
    

    While C does not. That's why a warning is issued if you compile it a ISO C rather than ISO C++. This is formally described as:

    A return statement with an expression of type void can be used only in functions with a return type of cv void

    0 讨论(0)
  • 2020-12-08 13:59

    Standard C does not support this construction:

    C11 6.8.6.4: The return statement

    Constraints

    1 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.

    No special provisions are added for the special case in the question. Some C compilers do support this as an extension (gcc does, unless instructed to conform to one of the C Standards), but C11 and previous versions consider it a constraint violation.

    0 讨论(0)
提交回复
热议问题