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 신고서
제약
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 A
return반환 타입이 다음과 같은 함수에는 표현이 있는 문장이 나타나지 않아야 한다.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
'source' 카테고리의 다른 글
| v-model 2 값은 어떻게 합니까? (0) | 2022.08.28 |
|---|---|
| Vue Devtools가 로컬에서 작동하지 않음 (0) | 2022.08.28 |
| 카드 그룹 부트스트랩 vue에서 열을 설정하려면 어떻게 해야 합니까? (0) | 2022.08.28 |
| vue 파일 스타일을 하나의 개별 style.css 파일로 추출하는 방법 (0) | 2022.08.28 |
| 왜 MACRO+0을 사용하는가!=0 (0) | 2022.08.27 |