2

은 그래서 예를 들어, 참조되지 않은 매개 변수 경고를 방지하는 방법을 설명 스레드의 수를 본 적이 :참조되지 않은 매개 변수를 처리하는 방법에 따라 컴파일러에서 다른 작업을 수행합니까?

Avoid warning 'Unreferenced Formal Parameter'
C++ What is the purpose of casting to void?

하지만 궁금하고있어 컴파일러에 따라 다른 아무것도 할 것인지 여부입니다 어떤 접근 방식이 사용됩니까? 예를 들어, 다음의 세 가지 상황에 대한 컴파일 된 출력이 다를 수 있습니까?

void Method(int /*x*/) 
{ 
    // Parameter is left unnamed 
} 

void Method(int x) 
{ 
    x; // This would be the same as UNREFERENCED_PARAMETER(x); 
} 

void Method(int x) 
{ 
    (void)x; // This would be the same as _CRT_UNUSED(x); 
} 

나는 컴파일러이 어떤 작업을 수행하는지의 관점에서이 가장 관심이 있어요,하지만 당신은 다른 사람을 통해 하나의 접근 방식에 대해 강하게 느끼는 경우에, 나뿐만 아니라 그 주장을 듣고 행복 해요.

+0

흥미롭게도 저는 옵션 1에서 정상적으로 스마트 포인터와 같은 개체를 최적화 할 수 있는지 궁금합니다. 생성자/소멸자 쌍이 호출됩니다. 참조되지 않은 매개 변수 경고는 생성되지 않지만 매개 변수를 주석 처리하면 이러한 호출을 피할 수 있을지 궁금합니다. AFC에서 멀리 떨어져 있지만 나중에 기억해두면 테스트 해 보겠습니다. – FrolickingFerret

답변

0

컴파일러가 다른 것을 처리 할 이유가 없습니다. 그러나 컴파일러에 대해 확실히 알 수있는 유일한 방법은 컴파일러의 출력을 살펴 보는 것입니다.

이 상황 (사용하지 않은 매개 변수)은 해당 언어 기능이 설계된 것이기 때문에 첫 번째 옵션을 선호합니다.

+0

감사합니다. 필자가 사용하는 컴파일러를 확실히 확인할 수 있습니다. 여기서 내가 묻는 이유는 부분적으로 누군가가 "아니오! N 옵션을 사용하지 마십시오!"라고 말하면 볼 수 있습니다. 그런 컴파일러에서 나쁜 일을 할 것입니다. " 또한 일반적으로 옵션 1을 선호하지만 현재 Microsoft VC++ 컴파일러를 사용하고 있으며 어설 션 또는 디버그 전용 코드에서 매개 변수가 사용되는 상황이 많기 때문에 현재 UNREFERENCED_PARAMETER에 기대고 있습니다. – FrolickingFerret

+0

나는 제임스의 답을 많이 좋아하지만이 질문은 나의 질문의 수행 측면과 더 일치한다. – FrolickingFerret

2

마지막 옵션 인 대부분의 경우 (void)x;이 바람직합니다.

첫 번째 옵션은 매개 변수의 이름을 지정하지 않은 채로 허용되지만 디버깅 목적으로 매개 변수 이름을 사용하는 것이 유용합니다 (예 : 함수에서 매개 변수를 사용하지 않는 경우에도 디버깅 할 때 그 가치에 관심이있다). 이 옵션이 괜찮은 경우가 있습니다 (예 : tag dispatching 일 때.

두 번째 옵션 인 x;은 다른 경고를 유발할 수 있습니다. 이 코드에 대한 C4555 경고 발급 ++ 비주얼 C는 :

warning C4555: expression has no effect; expected expression with side-effect 

(void)x;를 통해 voidx 캐스팅으로이 경고가 억제된다. 이 경고는 기본적으로 해제되어 있으므로이 경고는 #pragma 또는 명령 줄 옵션을 통해 명시 적으로 사용하도록 설정해야합니다.

+0

감사합니다. 옵션 2가 다른 경고를 생성 할 수 있음을 아는 것이 좋습니다. 이 점에서 옵션 3의 경우 +1이됩니다. 그러나 이는 성능과 관련이 없습니다. – FrolickingFerret