Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回C和C中的void类型++;_C++_C_Gcc_Clang_Language Lawyer - Fatal编程技术网

C++ 返回C和C中的void类型++;

C++ 返回C和C中的void类型++;,c++,c,gcc,clang,language-lawyer,C++,C,Gcc,Clang,Language Lawyer,这在编译时没有任何警告 < P>这是C和C++中的合法还是在GCC和CLAN中工作? 如果它是合法的,它是C99之后的新事物吗 void f(){ } void f2(){ return f(); } 更新 正如“雷克萨斯”所建议的,我尝试了以下方法: $ gcc -Wall -Wpedantic -c x.c x.c: In function ‘f2’: x.c:7:9: warning: ISO C forbids ‘return’ with expression, in f

这在编译时没有任何警告

< P>这是C和C++中的合法还是在GCC和CLAN中工作? 如果它是合法的,它是C99之后的新事物吗

void f(){

}

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

正如“雷克萨斯”所建议的,我尝试了以下方法:

$ 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();



更新

有人问这个建筑有什么帮助。Well或多或少是语法上的糖。这里有一个很好的例子:

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");
}

此代码在
C++
中是允许的,但在
C

在返回void的函数中,带有表达式的return语句可以 如果表达式类型为void,则使用


C11规范草案n1570中的OTOH:

第二版的主要变化包括:

在返回表达式的函数中不允许不带表达式的返回 价值(反之亦然)

return
,在返回
void
的函数中不允许使用表达式)

和6.8.6.4返回


带有表达式的返回语句不得出现在函数中 其返回类型为void。没有表达式的返回语句 只能出现在返回类型为void的函数中


(即使表达式的计算结果为
void

ISO/IEC 9899:201x委员会草案规定如下:

6.8.6.4返回报表

约束条件

  • 带有表达式
    return
    语句不得出现在返回类型为
    void
    的函数中

    没有表达式的
    return
    语句只能出现在 返回类型为
    void
    的函数

  • 所以,在C中是禁止的


    您需要使用
    -pedantic
    切换到
    gcc
    ,以便it对标准违规行为进行投诉:

    test.c: In function ‘f2’:
    test.c:6:12: warning: ISO C forbids ‘return’ with expression, in function returning void 
                [-Wpedantic]
         return f();
    

    标准C不支持这种结构:

    C116.8.6.4:
    返回
    语句

    约束条件

    1带有表达式的
    return
    语句不得出现在返回类型为
    void
    的函数中。没有表达式的
    return
    语句只能出现在返回类型为
    void
    的函数中


    对于问题中的特殊情况,没有增加特别规定。一些C编译器支持这一扩展(<代码> GCC >,除非被指示符合C标准之一),但是C11和以前的版本认为它是一个约束违反。

    < P> <强> C11 < /强>,“3.84.4”“<代码>返回< /Cord>语句”:

    带有表达式的
    return
    语句不得出现在返回类型为
    void
    的函数中

    ,即使表达式为
    void
    类型,也不能使用该表达式

    同一文件的前言:

    第二版的主要变化包括:

    [……]

    • return
      在返回值的函数中不允许不带表达式(反之亦然)
    因此,这是C89->C99(语言标准的第二版)的一个变化,并且从那时起一直如此


    C++14,6.6.3“返回
    语句”:


    带有非void类型表达式的return语句只能在返回值[…]的函数中使用
    表达式类型为void的return语句只能在返回类型为cv的函数中使用 无效的在函数返回其调用方之前对表达式求值


    ,如果表达式为void类型(自C++98以来一直有效),则可以使用该表达式。

    C++允许这样的操作:

    void f() 
    {
        return void();
    }
    
    而C则不是。这就是为什么如果你编译一个ISO C而不是ISO C++的话发出警告。这正式描述为:


    带有void类型表达式的return语句只能用于 返回类型为cv void的函数


    投票决定重新开放;建议的副本仅用于C++。这也是C.(C++和C++在使用<代码> Value>代码>时有很大不同)。所以你是在问C还是C++?选择一种语言。注意:使用两个代码> GCC-WALDOW-ANDIATIC-STD= C99 < /Cord>和 -STD= C11,您得到警告:“警告:ISO禁止用表达式返回,函数返回空格[-Wpedantic ]。@ HOLYBLASCAT:我能同时询问C、C++和java吗?)戴夫索拉:好吧,我会说得更清楚。IMO是一个很好的问题,它既有C又有C++的特性。通常,这些特性在两种语言中的行为相似。如果不是,一个很好的答案将描述差异。它看起来正确,但标准的参考这两个索赔将是好的。最好是引用C++标准和可能的文件,因为哪个版本的建设是允许的。cppreference不是一个非常可靠的源代码,许多代码示例都有bug。@chqrlie你能给我一个链接,指向代码示例正在编写的页面@en.cppreference吗?@MohitJain:仅举一个例子:使用gcc 4.6:
    main.cpp:31:1:警告:控件到达非空函数的末尾[-Wreturn type]
    。C99之后没有错误,但样式不好。@chqrlie谢谢。我没有C++规范,我需要最新的草稿和E.CPPype来参考我的参考。@ Mujjayn:C++最新草稿已经足够接近了。源代码实际上可以在github上获得!我希望C和C++标准是免费公开的。参考文献事实上有很好的记载,我之前的判断可能反映了我对法语翻译的印象。任何可见的bug都可以在发现时修复。“带有void类型表达式的return语句只能在返回类型为cv void的函数中使用”但是为什么有人想编写这样毫无意义的代码呢?而不仅仅是写
    void f2(){f();}
    。看来一定有理由
    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");
    }
    
    test.c: In function ‘f2’:
    test.c:6:12: warning: ISO C forbids ‘return’ with expression, in function returning void 
                [-Wpedantic]
         return f();
    
    void f() 
    {
        return void();
    }