代码之家  ›  专栏  ›  技术社区  ›  Karel Petranek

是否返回无效代码?

c c++
  •  54
  • Karel Petranek  · 技术社区  · 14 年前

    我发现下面的代码被Visual C++ 2008和GCC 4.3编译器所接受:

    void foo()
    {
    
    }
    
    void bar()
    {
      return foo();
    }
    

    我对它的编译有点惊讶。这是语言特性还是编译器中的bug?C/C++标准对此有何看法?

    4 回复  |  直到 14 年前
        1
  •  69
  •   Cubbi    14 年前

    它是C++语言的一个特点。

    C++(ISO1488~2003)6 .6 3/3

    表达式类型为__cv void_157;的RETURN语句只能在返回类型为cv void的函数中使用;在函数返回到其调用方之前对表达式进行计算。

    C(ISO 9899:1999)6.8.6.4/1

    带有表达式的RETURN语句不应出现在返回类型为 是无效的。

        2
  •  50
  •   zvrba    14 年前

    是的,它是有效的代码。当您具有模板函数以便使用统一代码时,这是必需的。例如,

    template<typename T, typename P>
    T f(int x, P y)
    {
      return g(x, y);
    }
    

    现在, g 当第二个参数是某个特定类型时,可能会重载以返回void。如果“返回void”无效,则调用 f 然后就会断裂。

        3
  •  5
  •   kofifus    10 年前

    这是有效的,并且非常有用,例如,当您希望在返回之前执行一些错误处理时,可以创建更清晰的代码:

    void ErrRet(int code, char* msg)
    {
       // code logging/handling error
    }
    void f()
    {
       if (...) return ErrRet(5, "Error Message !");
       // code continue
    }
    
        4
  •  1
  •   liorda    9 年前

    确实有效。我经常将其用于输入验证宏:

    #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());
      ...
    }