code

무효 유효한 코드를 반환합니까?

codestyles 2020. 12. 29. 07:07
반응형

무효 유효한 코드를 반환합니까?


다음 코드가 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

반응형