2013-02-12 3 views
4

내가 완전히 이식 가능하고 특정 아키텍처에 묶이지 않기를 원하는 C 프로그램 (C99 또는 C2011)을 작성하고 싶다고 가정 해 보겠습니다.정수 타입이 C

그것은 내가 다음 이전 정수 타입 (int, long, short)과 친구로부터 깨끗한 휴식을 확인 하 고 int8_t, uint8_t, int32_t 등 (아마도 사용을 사용하고 싶을 것 같다하여 leastfast 버전).

다음 반환 유형은 main입니까? 아니면 우리는 int와 strick해야합니까? 표준에 따라 int이 필요합니까?

GCC-4.2

#include <stdint.h> 
#include <stdio.h> 
int32_t main() { 
    printf("Hello\n"); 
    return 0; 
} 

를 작성하지만 내가

hello.c:3: warning: return type of ‘main’ is not ‘int’ 

이 때문에 타입 정의, 의심의 여지입니다를 얻을 수 있기 때문에 내가 uint32_t 또는 int8_t을 사용할 수 있습니다. 반환 형식을 대상 아키텍처로 두지 않는 한 불특정 크기 유형을 사용해야하는 경우가있는 것 같습니다. 이 해석이 맞습니까? 코드베이스에 "단지 하나"의 평범한 오래된 코드가있는 것은 이상한 것처럼 보입니다.하지만 실용적으로 기쁘게 생각합니다.

+4

'main()'의 리턴 타입으로'int'를 사용하면 어떤 이식성 문제가 있다고 느끼십니까? – JasonD

+0

int는 모든 컴퓨터에서 컴파일된다는 점에서 이식성이 뛰어납니다. 이제 12344567891233445567을 반환하려고 할 때 문제가 발생하지만 마지막으로 그랬을 때 정직하게 생각해 보겠습니다. 반환하는 모든 숫자는 비교적 작아야합니다. 예 : 에러 코드. –

+0

'int'를 사용하면이 경우에 프로그램을 이식성있게 만드는 반면, 다른 곳에서는 이식성이 고정 된 크기 유형을 사용해야한다고 생각합니다. 아마도 그것은 단지 필요한 비대칭 일 것입니다. –

답변

9

은 가정하자 나는 완전히 휴대용 및 특정 아키텍처에 묶여 있지되고 싶어 하는 C 프로그램 (C99 또는 C2011)를 쓰기 바랍니다.

내가 다음 이전 정수 타입 (INT, 긴, 짧은)과 친구에서 깨끗한 휴식을 확인 만 int8_t, uint8_t, int32_t를 사용하는 등 (아마도 사용하고 싶을 것 같다하여 최소 및 빠름 버전).

굵게 표시된이 두 확인은 모순입니다. uint32_t, uint8_t 및 al을 사용할 수 있는지 여부는 실제로 구현 정의 (C11, 7.20.1.1/3 : 정확한 너비 정수 유형)인지 여부에 따라 달라집니다.

프로그램을 실제로 이식하려는 경우 기본 제공 유형 (int, long 등)을 사용해야하며 C 표준에 정의 된 최소 범위 (예 : C11, 5.2.4.2)에 부합해야합니다.1 : 정수 타입)의 크기는

예를 당

, 표준은 모두 shortint부터 적어도 -32767 적어도 32767 그래서 당신은 더 큰을 저장하려면 또는 범위해야한다고 말한다 적은 값, 예를 들어 42000의 경우 long을 대신 사용하십시오.

6

C89, C99 및 C11에서 main의 반환 유형은 int이어야합니다.

정확한 너비 정수 유형은 정수 유형의 별명입니다. 따라서 int에 올바른 별칭을 사용하더라도 여전히 유효합니다. 예를 들어

:

int32_t main(void) 

int32_tint 경우에 형식 정의된다.

+0

나는 많은 것을 알았지 만 C99 또는 C11 표준의 무료 버전을 찾을 수 없었다. 내가 찾을 수있는 최신 공짜 물건은 [이 사람] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf) 날짜입니다. –

+1

C99의 최신 초안을 찾을 수 있습니다 여기 : http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf 및 C11의 최신 초안 : http://www.open-std.org/jtc1/sc22 /wg14/www/docs/n1570.pdf – ouah