태그 보관물: c

c

사용하지 않는 반환 값을 무효화하는 이유는 무엇입니까? 있습니까, 아니면 완전한 시간 낭비라고 생각하는

int fn();

void whatever()
{
    (void) fn();
}

사용하지 않은 반품 가치를 무효화 할 이유가 있습니까, 아니면 완전한 시간 낭비라고 생각하는 것이 맞습니까?

후속 조치 :

꽤 포괄적 인 것 같습니다. 자체 문서화 코드가 주석보다 낫기 때문에 사용하지 않는 반환 값을 주석 처리하는 것보다 낫다고 생각합니다. 개인적으로 불필요한 소음 이니까이 경고를 끄겠습니다.

그것 때문에 벌레가 도망 치면 내 말을 먹어 볼게 …



답변

David의 대답 은이 함수가 반환하는 것을 알고 있지만 명시 적으로 무시하고 있음을 다른 “개발자”에게 명시 적으로 보여 주려는 동기를 거의 다룹니다.

이는 필요한 오류 코드가 항상 처리되도록하는 방법입니다.

C ++의 경우 전체 정적 캐스트 표기법을 사용하는 것이 과도하게 느껴지기 때문에 C 스타일 캐스트도 사용하는 것을 선호하는 유일한 장소라고 생각합니다. 마지막으로 코딩 표준을 검토하거나 작성하는 경우 오버로드 된 연산자 (함수 호출 표기를 사용하지 않음)에 대한 호출도 이것에서 제외되어야한다고 명시 적으로 명시하는 것도 좋습니다.

class A {};
A operator+(A const &, A const &);

int main () {
  A a;
  a + a;                 // Not a problem
  (void)operator+(a,a);  // Using function call notation - so add the cast.

답변

직장에서 우리는 함수가 반환 값을 가지고 있음을 인정하기 위해 그것을 사용하지만 개발자는 그것을 무시해도 안전하다고 주장했습니다. 질문에 C ++ 태그를 지정 했으므로 static_cast 를 사용해야합니다 .

static_cast<void>(fn());

컴파일러가 반환 값을 void로 캐스팅하는 한 의미가 거의 없습니다.


답변

이 작업을 수행하는 진정한 이유는 lint 라는 C 코드에서 사용 된 도구로 거슬러 올라갑니다 .

가능한 문제를 찾고 경고 및 제안을 발행하는 코드를 분석합니다. 함수가 확인되지 않은 값을 반환하면 lint우연한 경우 경고합니다. lint이 경고 를 무음 으로 처리 하려면으로 전화를 (void)겁니다.


답변

캐스팅 대상 void은 사용되지 않은 변수 및 저장되지 않은 반환 값 또는 식에 대한 컴파일러 경고를 억제하는 데 사용됩니다.

Standard (2003)는 §5.2.9 / 4에서 다음과 같이 말합니다.

모든 표현식은 “cv void”유형으로 명시 적으로 변환 할 수 있습니다. 식 값이 삭제됩니다 .

따라서 다음과 같이 작성할 수 있습니다.

//suppressing unused variable warnings
static_cast<void>(unusedVar);
static_cast<const void>(unusedVar);
static_cast<volatile void>(unusedVar);

//suppressing return value warnings
static_cast<void>(fn());
static_cast<const void>(fn());
static_cast<volatile void>(fn());

//suppressing unsaved expressions
static_cast<void>(a + b * 10);
static_cast<const void>( x &&y || z);
static_cast<volatile void>( m | n + fn());

모든 양식이 유효합니다. 나는 보통 다음과 같이 짧게 만듭니다.

//suppressing  expressions
(void)(unusedVar);
(void)(fn());
(void)(x &&y || z);

그것도 괜찮습니다.


답변

C ++ 17 이후로 캐스트 [[maybe_unused]]대신 사용할 수있는 속성이 있습니다 void.


답변

Cast to void는 비용이 들지 않습니다. 컴파일러를위한 정보 일뿐입니다.


답변

프로그램의 기능을 위해 void로 캐스팅하는 것은 의미가 없습니다. 또한 David의 답변에서 제안한 것처럼 코드를 읽는 사람에게 신호를 보내는 데 사용해서는 안된다고 주장합니다. 당신의 의도에 대해 뭔가를 전달하고 싶다면 코멘트를 사용하는 것이 좋습니다. 이와 같은 캐스트를 추가하면 이상하게 보이고 가능한 이유에 대한 질문이 제기됩니다. 그냥 내 의견 …