2017-11-22 11 views
0

내가 그와 마찬가지로 '자연'유형을 정의하려고 이력서에서typedef로 자연 형을 정의하려는 시도가 왜 효과가 없습니까?</p> <pre><code>typedef unsigned int nat; </code></pre> <p>나는 NAT 변수를 정의한다면, 그 변수가 보통 INT처럼 동작 :

nat natural_index; 
natural_index = 10; // That's what I want. 
natural_index = -10; // Still a valid option. 

을, 나는 원 "-10은 부호없는 정수가 아닙니다."와 같이 컴파일러가 메시지를 표시하지 않는 이유를 알기 위해 '자연스러운'유형을 정의하기 위해 무엇을 할 수 있습니까?

추가 정보 : 변수 natural_index를 "printf"하고 값 '-10'이 인쇄되었습니다. 나는 적어도 또 다른 양수 (정확히 10은 아님)를 예상했다.

+0

진단을 보려면 컴파일러 경고 수준을 높일 수 있습니다. gcc에서'-Wconversion'을 사용하여 다음을 볼 수 있습니다 :'경고 : 부호없는 타입으로 암시 적으로 변환 된 음의 정수 [-Wsign-conversion] x = -10;' –

+1

위대한! 이 메시지는 여기 (그리고 다른 것들)에서 실제로 나타났습니다! 훌륭한 팁! 감사합니다 @DavidBowling – Vytor

답변

5

C는 두 가지 레벨에서 수행하려는 작업을 지원하지 않습니다.

첫째, C에서 typedef은 새로운 고유 한 유형을 생성하지 않습니다. 원래 형식에 대한 속기 이름을 만듭니다. 따라서,

typedef unsigned int nat; 

선언

nat natural_index; 

100 %에 해당 후, typedef의 포인트는 무엇 (

unsigned int natural_index; 

에? 그것은 가장 유용 후에 때 "기본 유형"힘 예를 들어 표준 형식 정의 uint64_t은 t에 따라 unsigned long 또는 unsigned long long의 줄임말 일 수 있습니다. 그 아키텍처.

두 번째로 C는 산술 표현식이 암시 적 변환을 수행하는지 여부를 변경하는 메커니즘이 없습니다.

natural_index = -10; 

에서 할당 연산자는 큰 부호없는 숫자 (유형 int 포함) 음수 -10 변환 (아마도 즉 (UINT_MAX - 10) + 1, 반드시 그런 것은 아니지만, 4294967286) 과정에서, 그리고 방법이 없습니다 사용 중지합니다.

옵션은 실제로 이런 종류의 것 (예 : Ada, Haskell, ML)을 지원하거나 C 자체를 구문 분석하고 적용 할 규칙을 적용하는 "linting"프로그램을 작성하는 것입니다 (기존 예 : lintsparse입니다.

+0

위대한, @ zwol! 이것은 매우 잘 설명되었습니다! 하지만 'natural_index'변수를 출력하고'-10' 값이 출력되기 때문에 여전히 두 번째 인수에 문제가 있습니다. 그리고 나는'natural_index-1'과 같은 연산을하고 결과는'-11'입니다. – Vytor

+0

'% u' 대신'% d' 인자를 사용하여 인쇄하고있었습니다. 그러나'printf'로이 변환에 흥미로운 것을 발견했습니다. – Vytor

+0

@Vytor 그렇습니다. 'printf'형식 명세를 인수와 일치 시키려면 전적으로 여러분에게 달려 있습니다. 컴파일러는 일치하지 않는 경우 경고 메시지를 표시하는 모드가 있거나 없을 수 있지만 C가 얻는 것만 큼 도움이됩니다. – zwol

2

expression-statements를 세미콜론으로 분리하는 것을 잊었습니다 ;. 할당 연산자 =의 평가 기간 동안 많은 서명 수

natural_index = 10; 
natural_index = -10; 

-10. ISO9899에서

6.5.16.1p2 (단순 할당)을 말한다

간단한 대입 (=)에서

가 오른쪽 피연산자의 값이 대입 식의 형식으로 변환된다. 스토리지 클래스 지정자 typedef를 사용하는 경우

이 파서의 환경에서하거나 출력하는 구문 분석 트리의 유형 unsigned int의 별칭 식별자 nat을 추가하는 파서를 알려줍니다. 이 경우 nat은 선언에서 유형으로 평가되므로 식별자가 natural_index 인 객체를 선언하면이 객체와 연결된 왼쪽 값의 유형은 unsigned int이됩니다.

+0

감사합니다 @alinsoar! 하지만 위의 코드는 간단한 샘플이었습니다. 실제 코드에서는 세미콜론을 잊지 않았습니다 :). 내 문제는 컴파일하고 natural_index 변수를 인쇄 할 때 인쇄 된 값이 '-10'이었고 적어도 음이 아닌 숫자 또는 일부 오류가 예상된다는 것이 었습니다. – Vytor