簡體   English   中英

在C和C ++中返回void類型

[英]Return void type in C and C++

這編譯沒有任何警告。

這在C和C ++中是合法的還是只在gcc和clang中工作?

如果它是合法的,那么在C99之后它是新東西嗎?

void f(){

}

void f2(){
    return f();
}

更新

正如“Rad Lexus”建議我試過這個:

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

$ clang -Wall -Wpedantic -c x.c 
x.c:7:2: warning: void function 'f2' should not return void expression [-Wpedantic]
        return f();
        ^      ~~~~~
1 warning generated.

$ gcc -Wall -Wpedantic -c x.cc
(no errors)

$ clang -Wall -Wpedantic -c x.cc
(no errors)

更新

有人問這個建築是如何幫助的。 好吧或多或少的語法糖。 這是一個很好的例子:

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

C11,6.8.6.4 “的return聲明”:

帶有表達式的return語句不應出現在返回類型為void的函數中。

,您可能不會使用表達式,即使它是void類型。

從同一文件的前言:

第二版的主要變化包括:

[...]

  • return沒有表達式的return不允許返回值的函數(反之亦然)

所以這是從C89 - > C99(語言標准的第二版)的變化,從那時起就一直如此。


C ++ 14,1.6.3“ return語句”:

帶有非void類型表達式的return語句只能在返回值的函數中使用[...]帶有void類型表達式的return語句只能在返回類型為cv void的函數中使用; 在函數返回其調用者之前計算表達式。

是的 ,你可以使用一個表達式, 如果它是void類型(自C ++ 98以來一直有效)。

此代碼在C++是允許的,但在C不允許

來自Return語句@cppreference

在返回void的函數中,如果表達式類型為void,則可以使用帶表達式的return語句。


OTO在C11規格草案n1570中:

第二版的主要變化包括:

返回沒有表達式的返回不允許返回值的函數(反之亦然)

return帶有返回void函數中不允許的表達式)

和6.8.6.4返回

帶有表達式的return語句不應出現在返回類型為void的函數中。 不帶表達式的return語句只能出現在返回類型為void的函數中。

(即使表達式評估為void

C ++允許這樣的東西:

void f() 
{
    return void();
}

雖然C沒有。 這就是為什么如果編譯ISO C而不是ISO C ++就會發出警告。 這被正式描述為:

表達式為void的return語句只能在返回類型為cv void的函數中使用

ISO / IEC 9899:201x委員會草案說明如下:

6.8.6.4退貨聲明

約束

  1. 帶有表達式的return語句不應出現在返回類型為void的函數中

    不帶表達式的return語句只能出現在返回類型為void的函數中。

所以,它在C中被禁止。


你需要使用-pedantic切換到gcc來抱怨標准違規行為:

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

標准C不支持這種結構:

C11 6.8.6.4: return聲明

約束

1帶有表達式的return語句不應出現在返回類型為void的函數中。 不帶表達式的return語句只能出現在返回類型為void的函數中。

對於問題中的特殊情況,沒有增加特殊規定。 一些C編譯器確實支持這作為擴展( gcc確實,除非指示符合C標准之一),但C11和以前的版本認為它是違反約束。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM