반응형
무효 유효한 코드를 반환합니까?
다음 코드가 Visual C ++ 2008 및 GCC 4.3 컴파일러에서 허용된다는 것을 알았습니다.
void foo()
{
}
void bar()
{
return foo();
}
나는 그것이 컴파일된다는 것에 약간 놀랐습니다. 이것은 언어 기능입니까 아니면 컴파일러의 버그입니까? C / C ++ 표준은 이것에 대해 무엇을 말합니까?
C ++의 언어 기능입니다.
C ++ (ISO 14882 : 2003) 6.6.3 / 3
"cv void"유형의 표현식이있는 return 문은 반환 유형이 cv void 인 함수에서만 사용할 수 있습니다. 표현식은 함수가 호출자에게 반환되기 직전에 평가됩니다.
C (ISO 9899 : 1999) 6.8.6.4/1
표현식이있는 return 문은 반환 유형이 void 인 함수에 나타나지 않습니다.
예, 유효한 코드입니다. 균일 한 코드를 사용할 수 있도록 템플릿 함수가있을 때 필요합니다. 예를 들면
template<typename T, typename P>
T f(int x, P y)
{
return g(x, y);
}
이제 g
두 번째 인수가 특정 유형일 때 void를 반환하도록 오버로드 될 수 있습니다. "returning void"가 유효하지 않은 경우 호출 f
이 중단됩니다.
이것은 유효하며 예를 들어 반환하기 전에 오류 처리를 수행하려는 상황에서 더 깨끗한 코드를 만드는 데 매우 유용 할 수 있습니다.
void ErrRet(int code, char* msg)
{
// code logging/handling error
}
void f()
{
if (...) return ErrRet(5, "Error Message !");
// code continue
}
참으로 유효합니다. 입력 유효성 검사 매크로에 자주 사용합니다.
#define ASSERT_AND_RETURN_IF_NULL(p,r) if (!p) { assert(p && "#p must not be null"); return r; }
bool func1(void* p) {
ASSERT_AND_RETURN_IF_NULL(p, false);
...
}
void func2(void* p) {
ASSERT_AND_RETURN_IF_NULL(p, void());
...
}
참조 URL : https://stackoverflow.com/questions/3383090/is-returning-void-valid-code
반응형
'code' 카테고리의 다른 글
루비 스타일 : 중첩 된 해시 요소가 있는지 확인하는 방법 (0) | 2020.12.29 |
---|---|
cglib에 대한 대안이 있습니까? (0) | 2020.12.29 |
순전히 기능적인 데이터 구조의 이점은 무엇입니까? (0) | 2020.12.29 |
cygwin은 파일 권한을 000으로 설정합니다. (0) | 2020.12.29 |
전역 변수가 있는지 확인하는 올바른 방법은 무엇입니까? (0) | 2020.12.29 |