可以在return语句中省略return关键字吗?

时间:2015-11-25 06:07:59

标签: c++

我最近在Apache Axis tutorial example.

中遇到了以下代码
int main()
{
    int status = AXIS2_SUCCESS;

    axutil_env_t *env = NULL;
    axutil_allocator_t *allocator = NULL;
    env = create_environment();

    status = build_and_serialize_om(env);

    (status == AXIS2_FAILURE)
    {
        printf(" build AXIOM failed");
    }

    axutil_env_free(env);

     0;
}

我不明白的是最后的0; 是没有return关键字的返回语句吗?

我尝试使用下面的代码在Visual Studio中测试它。

int main()
{
    0; // in the second run, replaced 0 with 28
}

两个程序都运行没有任何问题。但是echo %ERRORLEVEL% at windows命令行为两者返回0。

但下面的代码

int add()
{
    0;
}

原因

  

错误1错误C4716:'add':必须返回值

我了解0隐含添加了返回值main()

我没有问题,包括return关键字,但我是 将Axis2 / C库移植到C ++项目。而且有很多例子 我在哪里遇到0;

为什么上述语法会导致此未定义的行为?

2 个答案:

答案 0 :(得分:9)

在C ++中return可以在main()中,在void返回的函数中以及在构造函数和析构函数中省略 。在前一种情况下,main()会自动返回0。在您的情况下,语句0;是一个语法正确的语句,被评估为无操作,因此编译器基本上忽略它。

答案 1 :(得分:2)

您在哪里找到该代码?它似乎已被破坏,可能是由于格式化在网页上显示它或某些东西......?

原始代码(来自https://github.com/bnoordhuis/axis2-c/blob/master/axiom/test/util/axiom_util_test.c)是:

int main()
{
    int status = AXIS2_SUCCESS;
    axutil_env_t *env = NULL;
    status = build_and_serialize_om(env);

    if(status == AXIS2_FAILURE)
    {
        printf(" build AXIOM failed");
    }

    axutil_env_free(env);
    return 0;
}