return语句中可以省略return关键字

Can return keyword be omitted in a return statement?

本文关键字:return 关键字 语句      更新时间:2023-10-16

我最近在这个ApacheAxis教程示例中看到了下面的一段代码。

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关键字的return语句吗?

我尝试了下面的一段代码来在Visual Studio中对此进行测试

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

两个项目都顺利运行。但echo %ERRORLEVEL%windows命令行返回了0。

但是下面的代码

int add()
{
    0;
}

导致

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

我知道返回值0是为main()隐式添加的

我在包含return关键字方面没有任何问题,但我是将Axis2/C库移植到C++项目中。还有很多例子在那里我遇到了0;

为什么上面的语法会导致这种未定义的行为?

在C++中,只能在main()、返回void的函数以及构造函数和析构函数中省略return。在前一种情况下,main()自动返回0。在您的例子中,语句0;是一个语法正确的语句,被评估为no-op,所以编译器基本上忽略了它。

您在哪里找到代码的?它似乎已损坏,可能是由于在网页上显示它的格式或其他原因。。。?

原始代码(来自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;
}