2016-08-23 1 views
0

그래서 doctest 라이브러리를 작성 중이므로 경고 메시지가 표시됩니다.int와 unsigned에 대한 참조를 비교할 때 경고하지만 const (no ref)와 g ++/msvc를 비교하는 경우 경고가 표시되지 않습니다.

경고없이 if 문에 들어간 코드가 내 CHECK() 매크로 안에 쓰여질 때 문제를 일으키는 것으로 나타났습니다.

예 : if(0u == 0)은 경고를 표시하지 않지만 CHECK(0u == 0);은 경고를 발생시키지 않습니다.

조금만 조사했는데 CHECK() 매크로 뒤에는 템플릿 및 표현 분해 및 const 참조로 캡쳐가 있습니다.

내 질문은 3입니다 :이 3 개 조각을 감안할 때

  1. - 왜 이런 일이 발생 하는가?

    const int& a = 0; 
    const unsigned& b = 0; 
    if(a == b) 
    
      을 :

      const int a = 0; 
      const unsigned b = 0; 
      if(a == b) 
      

      경고를 제공합니다

      int a = 0; 
      unsigned b = 0; 
      if(a == b) 
      

      가 경고를하지 않습니다

  2. 는 경고를 표시합니다
  3. 어떻게이 문제를 해결할 수 있습니까? 분명히 라이브러리 헤더의 템플릿 주위에 #pragma diagnostic을 사용할 수 있으며 이러한 경고는 사라지지만 올바르지 않습니다.

    int a = 0; 
    unsigned b = 0; 
    CHECK(a == b); 
    
      int a = 0; 
      unsigned b = 0; 
      if(a == b) 
      

      다음 코드의 다음 조각은 또한 경고를해야한다 :

    그 이유는 다음과 같은 코드가 경고를 제공하는 경우이다 >

  4. const noref 경우에 대해 내가 빠뜨린 것이 있습니까? 어제 나는 this라는 질문을 게시 한 것이 현저히 비슷해 보인다. 내 템플릿의 const 참조에 의해 캡처되기 때문에 엉덩이에 나를 물린 다른 사례가 있습니까?

나는 문제 컴파일러 또는 최적화 수준을 생각하지 않는다 - 나는 약간 (MSVC에 대한 /W4와 g에 대한 -Wall -Wextra -pedantic + 50 more ++)/MSVC++ g의 버전을 시도하고 아마 그 소리는 동일하지 ...

편집 : 다음 코드는 g와 경고를 생산 ++하지만 MSVC로하지 않았다

(-Wsign-conversion)

const int a = -1; 
const unsigned b = 0; 
if(a == b) 

답변

1

보통 unsigned intint보다 큰 값을 나타낼 수 있습니다. unsigned intint으로 변환 할 수 있지만 실패하는 경우가 있습니다. 예를 들어 2의 보수 표기법에서 -1은 unsigned int에서 가장 큰 숫자로 변환됩니다 (둘 다 같은 크기의 컨테이너/레지스터를 사용한다고 가정).

런타임시 일부 참조를 초기화 할 수 있기 때문에 참조를 위해 const를 사용하는 경우에도 마찬가지입니다. 예를 들어, 함수가 인수에 const 참조를 가지고 있다고 말할 때. 당신은 단지 부름 시간에 그 가치를 알 것이다.

한편, const int 또는 const unsigned int은 컴파일시 알려진 값을가집니다. 컴파일러는 다른 것을 변환하는 방법을 알고 있고 부작용이 없으므로 경고가 필요하지 않습니다.

이 상황을 어떻게 해결할 수 있습니까? 그 (것)들 사이 동등한 다만 유형을 이용하십시오. 다른 유형을 사용하고 부작용을 알고 싶다면 컴파일러에서 수행중인 작업을 알고 캐스트 (static_cast)를 수행하도록 알릴 수 있습니다.

+0

필자는 여전히 컴파일러 작성자의 추론에 동의하지 않더라도 답변을 수락하기로 결정했으며이 답변이 마음에 들지 않습니다. – onqtam

1

2 개의 변수를 비교할 때 하나의 부호가 있고 하나는 부호가없는 변수를 비교할 때 경고를받는 것이 정상입니다.상수에 대한 는 다르다 :

이 코드는 경고를 제공하지 않습니다 ab가이 코드 조각을 가지고 컴파일 컴파일 시간에 평가가 모두 0

에 의해 대체되기 때문에 :

const int a = 0; 
const unsigned b = 0; 
if(a == b) 
{ 
    c =15; 
} 
else 
{ 
    c=67; 
} 

cout << c << endl; 
a==b 부분 주위

분해 :

if(a == b) 
{ 
     c=15; 
    1d: c7 45 f4 0f 00 00 00 movl $0xf,-0xc(%rbp) 
else 
{ 
     c = 67; 
} 
cout << c << endl; 

시험 전 건너 뛰었습니다. else은 건너 뜁니다 ... 왜 컴파일러가 경고를 발행합니까?

이 동작은 developpers에서 코드의 일부를 비활성화하는 데 때때로 사용됩니다. 항공 비즈니스에서 도달 할 수없는 코드는 금지됩니다. 이 메커니즘을 사용하면 코드가 생성되지 않습니다. 감사를 통해 시스템 코드 레벨에 데드 코드가 없음을 입증 할 수 있습니다.

관련 문제