일부 배경 :C89에서 고정 너비 정수를 사용하기 위해 잘 확립되고 표준화 된 방법이 있습니까?
헤더 stdint.h is part of the C standard since C99. 여기에는 부호가 있거나 부호가없는 8, 16, 32 및 64 비트 정수가 될 수있는 typedef가 포함됩니다. 이 헤더는 C89 표준의 일부는 아니지만, 은 내 데이터 유형이 알려진 길이인지 확인하기 위해 직접적으로 방법을 찾지 못했습니다.
실제 주제
(C89로 작성) SQLite는 64 비트 정수를 정의하지만, 나는 그것이 설득력 찾을 수없는 방법 다음 코드는에 도착. 즉, 나는 그것이 모든 곳에서 효과가있을 것이라고 생각하지 않습니다. 모두의 최악의, 그것은 자동으로 실패 할 수 있습니다 :
- 은 "문자"데이터 유형은 8 비트 길이 있음을 확인, it's not guaranteed to be 이후 :
/* ** CAPI3REF: 64-Bit Integer Types ** KEYWORDS: sqlite_int64 sqlite_uint64 ** ** Because there is no cross-platform way to specify 64-bit integer types ** SQLite includes typedefs for 64-bit signed and unsigned integers. */ #ifdef SQLITE_INT64_TYPE typedef SQLITE_INT64_TYPE sqlite_int64; typedef unsigned SQLITE_INT64_TYPE sqlite_uint64; #elif defined(_MSC_VER) || defined(__BORLANDC__) typedef __int64 sqlite_int64; typedef unsigned __int64 sqlite_uint64; #else typedef long long int sqlite_int64; typedef unsigned long long int sqlite_uint64; #endif typedef sqlite_int64 sqlite3_int64; typedef sqlite_uint64 sqlite3_uint64;
그래서, 이것은 내가 지금까지 뭘했는지입니다 . 전 처리기 변수 "CHAR_BIT"가 8과 같지 않으면 컴파일이 실패합니다.
- "char"은 8 비트 길이가 보장되므로 여러 개의 서명되지 않은 문자 배열을 포함하는 구조체를 만듭니다. 정수.
- 필자는 내 데이터 유형에 대해 "연산자"기능을 작성합니다. 덧셈, 곱셈, 나눗셈, 모듈로, 문자열과 변환/변환 등
헤더 파일에서이 과정을 추상화했습니다. 이것이 내가 알고있는 것과 함께 할 수있는 최선의 방법이지만, 이것을 달성하기위한보다 간단한 방법.
휴대용 C 라이브러리를 작성하고 싶습니다.
한 가지 해결책은 컴파일러가 제공하는 데이터 크기가 예상 한 것임을 확인하기 위해 컴파일 타임 어설 션을 사용하는 것일 수 있습니다. 예를 들면 다음과 같습니다. http://www.pixelbeat.org/programming/gcc/static_assert.html – David
현대적인 C 기능을 원하면 고대 C가 아닌 최신 C 코드를 작성하십시오. – Olaf
기본 정수 유형은 대개 런타임의 일부입니다 glibc와 같은 지원 라이브러리. 이러한 라이브러리는 결코 이식성이 뛰어나지 않도록 설계되었습니다. 이식성을 높이려는 노력은 대개 필요한 경우 다른 대상에 대해 같은 방법을 다른 방법으로 구현합니다. – user3528438