2016-08-09 2 views
0

나는 다음과 같은 C 코드가 "44 잘못된 인수 전환하려면 : 크기가 UB4를 초과 경고"보풀 경고

unsigned long val = <my_size>; 

switch(val) 
{ 
case (1L<<10): // 1KB 
    // Do something 
    break; 
case 1L<<20: // 1MB 
    // Do somnething 
    break; 
case (1L<<30): // 1GB 
    // Do something 
    break; 
case (1L<<40): // 1TB 
    // Do something 
    break; 
// Other cases 
default: 
    // Do something 
    break; 
} 

지금 보풀이 나에게
말하는 경고를주고있다을

unsigned long에서 스위치를 사용하는 것이 맞습니까?

컴파일 오류가 없지만 코드가 올바르게 작동하고 재미있는 롤오버 유형이 계속 진행되고 있는지 확인하려고합니다.

스위치에 케이스 라벨이 너무 많지는 않습니다. 나는이에 읽고에서 온 한

- 그것은 switch 문 유형과 같은 Why can't your switch statement data type be long, Java?

자바의 경우 오래 걸리지 않을 것이다. C에 대해서도 마찬가지입니까?

이 필요한 경우 : 1. 나는 리눅스 보풀을 사용하고 컴파일러 3. 플랫폼 2. GCC는 아니, 자바와는 달리, C switch 문의 제어 문이 하나가 될 것을 허용

+0

예, 스위치를 사용할 수 있습니다. 왜 K, M, T, G 접미사를 정수 리터럴에 추가하고 있습니까? 나는 그들에게 완전히 익숙하지 않다. 그들이하는 일 – Vality

+0

@Vality 1 KiloByte, 1 GigaByte, 1 TeraByte 등을 말하면서 큰 케이스 값을 정당화 할 수있는 예제를 쉽게 읽을 수 있습니다. –

+0

나는 그 질문에 답하는 것을 시도했지만, http://stackoverflow.com/help/mcve에서 잠시 살펴볼 것을 권한다. 실제로 구현되고 실행될 수있는 최소한의 예제를 선호하며 설명 된 증상을 생성합니다. 가능한 경우 빌드 가능한 코드와 도구에 대한 정보를 제공하여 문제를 재현 할 수 있도록하십시오. 다행스럽게도 도움이 될만한 대답을 줄 수 있기를 바랍니다. – Vality

답변

0

리눅스 64 비트입니다 정수 유형. 여기에는 int, long, unsigned long, uint32_t 및 기타 표준에 정의 된 거의 모든 정수 유형이 포함됩니다.

불행히도 코드가 실제 작동 코드로 보이지 않으며 MCVE가 아니기 때문에 실제 문제를 추측 할 수 있습니다. 또한 어떤 linting 소프트웨어 또는 컴파일러를 사용하는지 알지 못하므로 쉽게 오류 메시지를 찾을 수 없습니다.

그러나 가장 큰 문제는 가장 큰 사례 라벨이 제어문 유형의 최대 값을 초과한다고 의심됩니다. 예를 들어, 시스템에서 부호없는 long이 32 비트이면 프로그램은이 레이블보다 큰 대소 문자 레이블을 가질 수 있으므로이 레이블이 발생할 수없는 경우 경고가 적절합니다.

또 다른 가능성은 스위치가 시스템의 단일 스위치에있는 경우의 구현 한계보다 많은 레이블을 가지고 있다는 것입니다. 구현시이 제한을 설정할 수 있습니다.

실제 MCVE가 주어지면 더 많은 도움이 될만한 정보를 줄 수 있지만 대답은 주어진 그대로입니다.

TLDR : 난 정말이 코드에 의해 혼란 스러워요 unsigned long 또는 다른 정수형

+0

클레임을 백업하기위한 일부 C 표준 문서에 대한 링크가 있습니까? 컴파일이 잘되어서 C가 그다지 문제를 일으키지 않아도된다는 것을 알았지 만 gcc가 여분의 일을 할 수도 있습니다. 그것이 공식적으로 지원되지 않는다면, 이것은 다른 컴파일러 나 나중에 필자가 피하고자하는 문제점을 야기 할 수있다. 그것과는 별도로 미래에 대해서도 알고있는 것이 좋다. lint lint는 C 표준을 엄격하게 시행하기 때문에 불만이있는 경우 가장 잘 검사합니다. 예 : gcc는 C 코드의 줄 주석에 대해 울지 않을 것이지만 lint는 C 표준이 아닌 것입니다. 나는 그것이 같은 경우인지 여기에서 알고 싶었다. –

+0

case 절 제한을 초과하지 않아도 문제가 없습니다. 그리고 내가 말했듯이 린트 (lint) 나 gcc (gcc)에서 '오류'가 발생하지 않았지만 단지 '경고'일뿐입니다. –

+0

@Siddharth : [N1570] (http://www.open-std.org/jtc1/sc22/wg14/www /docs/n1570.pdf) : "** switch '** 명령문의 제어 표현식은 정수 타입을 가져야합니다." 'unsigned long'을 사용하는 것을 금지하는 제한은 없습니다. –