2010-06-11 4 views
40

는이 같은 슈퍼 클래스가 있습니다. cpp 파일에서이 오류가 발생합니다.피 경고 '참조되지 않은 형식 매개 변수'

warning C4100: 'param' : unreferenced formal parameter 

실제로 경고를 오류로 처리했습니다. 위의 경고를 피하는 방법?

감사합니다.

+0

부스트 :: ignore_unused (param) 사용 http://stackoverflow.com/a/24310846/888576 –

답변

71
방금이 작업을 수행 할 수 있도록 이름을 사용하지 않는 매개 변수를 제공하지 않아도 C++에서

:

void Child::Function(int) 
{ 
    //Do nothing 
} 

당신은의 선언에 매개 변수 이름을 유지하실 수 있습니다 헤더 파일을 문서화하여. 빈 문장 (;)도 필요하지 않습니다. @Charles 베일리가 언급 한 바와 같이

void Child::Function(int param) 
{ 
    (void)param; //Do nothing 
} 
+1

@ Charles .. 함수가 인라인이라면 이렇게 할 수 있습니까? 'class Child : public 부모 {public : void Function (int/* param */= 0, int param2 = 0) {std :: cout << param2 << std :: endl; }};' – bdhar

+0

기본값이있는 이름이없는 매개 변수가 있음을 의미합니다. 나는 100 % 확실하지는 않지만 그것이 합법적이라고 생각합니다. 왜 어떤 이유인지 모르겠다. –

+3

@bdhar : 기본값이 일치하지 않는 한 계층 구조의 여러 수준에서 기본 매개 변수를 제공하는 것은 위험합니다. 얻을 수있는 문제는 두 개의 컨텍스트에서 같은 함수를 호출하면 결국 다른 최종 값으로 동일한 최종 재정의자를 호출 할 수 있다는 것입니다.'struct base {virtual void f (int i = 0); }; struct derived : base {가상 void f (int i = 5); }; int main() {파생 된 d; 베이스 & b = d; d.f()/* D :: f (5) * /; b.f();/* D :: f (0) * /}' –

17

또 다른 기술은 무효로 캐스팅하는 것입니다.

그러나 특정 시나리오에서는 디버그 빌드에서 ASSERT()을 호출하지만 소매 빌드에서는 nop이므로 매개 변수 이름이 필요합니다. 그 시나리오가 다음과 같이 정의된다 (적어도 VC++ :-))에 편리한 매크로 UNREFERENCED_PARAMETER(),이다 : @R 사무엘 Klatchko 또한 게시 된 간단한 캐스트가 작동

#define UNREFERENCED_PARAMETER(x) x 

참고,하지만 난 개인적으로 더 찾을 이 코드가 참조되지 않은 매개 변수이거나 간단한 설명 할 수없는 캐스트라는 코드가 명확하면 읽을 수 있습니다.

+0

int와 같은 기본 제공 형식에는 이상이 없지만 매개 변수가 불완전한 형식에 대한 참조 인 경우 해당 매개 변수를 void로 캐스팅하면 이전에 그러한 필요성이 없었던 곳에서 볼 수있는 형식의 전체 정의가 필요합니다. – TheBeardyMan

+0

이것은 C 언어의 해결책이므로 유용합니다. – Bentoy13

+1

Qt의 Q_UNUSED 매크로는 약간 더 멋진 버전입니다. –

8

, 당신은 매개 변수 이름을 생략 할 수 있습니다 : 당신은 매개 변수 이름을 유지하려는 경우 사용할 수

+1

매크로 뒤에 숨어 있으면 좋은 생각입니다 (내 예제가 더 명확하다). 즉, 매크로에 캐스트를 추가하거나 경고를받을 수 있습니다 (g ++ 4.2.1에서는'경고 : 명령문에 아무런 영향이 없습니다 ') –

+0

디버그되지 않은 빌드에 대해 ASSERT (param)을 정의 할 수 있습니다 (void) 매개 변수. 귀하의 UNREFERENCED_PARAMETER은 그것이 전혀 언급되지 않았다고 제안합니다. 그러나 그것은 ASSERT에서 참조 될 수 있습니다. – harper

26

필자는 매크로를 사용하는 편이 더 낫다. 컴파일러는 나의 의도뿐만 아니라 코드의 다른 유지자들에게 알려주며 나중에 검색 할 수있다.

코드 이름을 주석으로 처리하는 방법은 코드에 익숙하지 않은 사람들 (또는 6 개월 후)이 쉽게 놓칠 수 있습니다.

그러나 스타일 문제이며 코드 생성, 성능 또는 견고성과 관련하여 어느 방법도 "더 좋거나"더 적합하지 않습니다. 나에게 결정적인 요소는 표준화 된 시스템을 통해 다른 사람들에게 나의 의도를 알리는 것이다. 매개 변수 이름을 생략하고 주석에 넣어 똑같이 잘 작동 : 또는

void CFooBar::OnLvnItemchanged(NMHDR *pNMHDR, LRESULT *pResult) 
{ 
    UNREFERENCED_PARAMETER(pNMHDR); 

:

void CFooBar::OnLvnItemchanged(NMHDR* /* pNMHDR */, LRESULT *pResult) 
{ 
    // Not using: pNMHDR 

나는 최악의 솔루션은 경고 메시지를 억제하는 것을 말할 것입니다; 그것은 전체 파일이나 프로젝트에 영향을 미칠 것이며, 아마도 당신은 뭔가를 놓친 지식을 잃을 것입니다. 적어도 매크로를 추가하거나 인수 이름을 주석 처리하여 다른 사람들에게이 인수를 사용하지 말 것을 의식한 결정을 내렸고 실수가 아님을 알았습니다.

WinNT의 Windows SDK.h는 DBG_UNREFERENCED_PARAMETER()DBG_UNREFERENCED_LOCAL_VARIABLE()과 함께 UNREFERENCED_PARAMETER()을 정의합니다. 그것들은 모두 동일한 것으로 평가되지만 차이점은 시작하는 중에 DBG_UNREFERENCED_PARAMETER()가 사용되며 코드가 더 완성되었을 때 매개 변수를 사용할 것으로 예상한다는 것입니다. 매개 변수를 사용하지 않을 것이라는 확신이 들면 UNREFERENCED_PARAMETER() 버전을 사용하십시오.

MFC (Microsoft Foundation Classes)의 매크로는 UNUSED()UNUSED_ALWAYS() 매크로가 비슷한 비슷한 규칙을 사용합니다.

스타일을 고수하고 붙여주세요. 이렇게하면 나중에 코드에서 "DBG_UNREFERENCED_PARAMETER"을 검색하고 인수를 사용할 것으로 예상되는 곳의 인스턴스를 찾을 수 있지만 그렇지 않은 인스턴스를 찾을 수 있습니다. 일관된 스타일을 채택하고 습관적으로 사용하면 나중에 나 자신이나 다른 사람이 쉽게 사용할 수 있습니다.

I이 참조되지 않은 형식 매개 변수의 경고를 억제하기 위해 매크로를 사용하는 것이
+1

필자의 의견으로는 매개 변수 이름에 대한 설명이 가장 우수하며 가장 읽기 쉽습니다. –

+1

@DavidKirby 정의에 따라 매개 변수를 사용할지 여부를 결정하는 함수 내부에 ifdef가 있으면 주석 처리 된 이름을 사용할 수 없습니다. –

+1

주석 처리 된 매개 변수는 함수 서명을 변경하는 버그 인 NMHDR */* pNMHDR */not NMHDR/* * pNMHDR * /와 같아야합니다. 더 일반적으로, 형식과 별 사이에 공백을 두지 마십시오. NMHDR * pNMHDR –

4

: 사용하지 않은 (x)는 (무효)가 x는, 그것은 아무튼 #DEFINE 달리

  • : 이것은 다음과 같은 장점이 있습니다

    #define UNUSED(x) (&reinterpret_cast< const int& >(x)) 
    

    그러한 요구가 존재하지 않았던 곳에서 볼 수있는 매개 변수 유형의 완전한 정의가 필요합니다.

  • #define UNUSED (x) & x와 달리, 형식이 단항 & 연산자에 과부하되는 매개 변수와 함께 안전하게 사용할 수 있습니다.
2

Pragma는 VS를 사용하고 있기 때문에 멋지게 작동합니다. 참조되지 않은 매개 변수는 콜백 인터페이스 및 파생 된 메소드에서 매우 일반적이므로이 경고는 매우 높은 노이즈 대 이익 비율을 갖습니다. W4를 사용하는 마이크로 소프트 윈도우 내에서 비록 팀은 무의미의 피로하게하고 단순히 프로젝트에 추가 (대한/벽 더 적합 할 것이다) :

#pragma warning(disable: 4100) 

당신이 코드의 단지 블록에 대한 경고를 완화하려면 , 그것을 둘러싸고 :

개 이상있는 경우 매개 변수 이름을 떠나는 연습은 쉽게 이름으로 검사도 시계 (에 추가 할 수 없습니다 디버거에서 단점을 가지고

이 혼동된다

#pragma warning(push) 
#pragma warning(disable: 4100) 
void SomeCallbackOrOverride(int x, float y) { } 
#pragma warning(pop) 
참조되지 않은 매개 변수), 특정 메서드 구현에서는 매개 변수를 사용할 수 없지만 값을 알고 있으면 whi를 알아낼 수 있습니다 ch 프로세스의 단계입니다. 특히 전체 호출 스택이없는 경우에는 더욱 그렇습니다.

관련 문제