source

C 및 C++의 반환 보이드 유형

goodcode 2022. 8. 28. 09:35
반응형

C 및 C++의 반환 보이드 유형

이것은 경고 없이 컴파일됩니다.

이것은 C와 C++에서 합법입니까, 아니면 gcc와 clang에서만 작동합니까?

합법이라면 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();

$ 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 "The"return스테이트먼트":

A return반환 타입이 다음과 같은 함수에는 표현이 있는 문장이 나타나지 않아야 한다.void.

아니요, 표현은 사용할 수 없습니다.void유형.

같은 문서의 머리말에서:

제2판의 주요 변경 사항은 다음과 같습니다.

[...]

  • return값을 반환하는 함수에서 허용되지 않는 표현식 없음(및 그 반대)

이것은 C89 -> C99(언어 표준 제2판)에서 변경된 것으로, 그 이후 계속 되고 있습니다.


C++14, 6.6.3 "The"return스테이트먼트":

non-void 타입의 표현식을 가진 리턴문은 값을 반환하는 함수에서만 사용할 수 있다[...] 타입의 표현식을 가진 리턴문은 리턴 타입의 cvoid를 가진 함수에서만 사용할 수 있다.이 식은 함수가 호출자에게 반환되기 직전에 평가된다.

, void 유형(C++98 이후 유효)인 경우 식을 사용할 수 있습니다.

이 코드는 에서 허용됩니다.C++단, 들어갈 수 없습니다.C

Return 스테이트먼트 @ cpp reference에서

리턴 보이드 함수에서는 표현 타입이 보이드일 경우 표현이 포함된 리턴문을 사용할 수 있다.


C11 사양 초안 n1570의 OTOH:

제2판의 주요 변경 사항은 다음과 같습니다.

값을 반환하는 함수에서 허용되지 않는 표현 없는 반환(및 그 반대)

(returna를 반환하는 함수에서 허용되지 않는 식을 사용하여void)

및 6.8.6.4 반환

리턴 타입이 무효인 기능에는 표현이 있는 리턴 스테이트먼트가 표시되어서는 안 된다.표현이 없는 반환문은 반환 유형이 무효인 기능에만 표시되어야 한다.

(표현이 다음과 같이 평가되어도)void)

C++는 다음과 같은 기능을 제공합니다.

void f() 
{
    return void();
}

반면 C는 그렇지 않다.따라서 ISO C++가 아닌 ISO C로 컴파일하면 경고가 발생합니다.이는 공식적으로 다음과 같이 기술됩니다.

void 형식의 표현식이 있는 반환문은 cvoid 유형의 함수에서만 사용할 수 있습니다.

ISO/IEC 9899:201x 위원회 초안에는 다음과 같은 내용이 기재되어 있습니다.

6.8.6.4 신고서

제약

  1. return반환 유형이 인 함수에는 식이 있는 문이 나타나지 않아야 합니다.

    A return은 반환 whose whose whose whose whose 함수에서만 .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는 이 구조를 지원하지 않습니다.

6. 6.8.6.4:return의 표시

제약

1 Areturn반환 타입이 다음과 같은 함수에는 표현이 있는 문장이 나타나지 않아야 한다.void.A.Areturn은 반환 whose whose whose whose whose 함수에서만 .void.

문제의 특별한 경우에 대한 특별한 조항은 추가되지 않았습니다. C 는 이를합니다(「C」).gccC 표준 중 하나에 준거하도록 지시되지 않는 한)에 준거합니다만, C11 및 이전 버전에서는 제약 위반으로 간주됩니다.

언급URL : https://stackoverflow.com/questions/35987493/return-void-type-in-c-and-c

반응형