왜 모두가 표준 C 유형보다 typedef합니까?


103

당신이 사용하려는 경우 Qt는을 , 당신은 포용해야한다 quint8, quint16등등합니다.

당신이 사용하려는 경우 입심을 , 당신은 환영에있다 guint8, guint16등등합니다.

리눅스u32, s16등등합니다.

uC / OSSINT32등을 정의 UINT16합니다.

그리고 이러한 것들의 조합을 사용해야한다면 문제에 대비하는 것이 좋습니다. 에 있기 때문에 컴퓨터가 u32될 것이다 typedef이상 거라고 longquint32typedef이상 거라고 int및 컴파일러는 불평 할 것이다 .

있는 경우 왜 모두가 이것을 <stdint.h>합니까? 이것이 도서관의 전통인가?


8
마이크로 컨트롤러 프로그래밍의 @Mehrdad는 모든 종류의 것을 가질 수 있습니다. 예를 들어 AVR Mega에서 (결과적으로 유명한 Arduino에서) int는 16 비트입니다. 그것은 끔찍한 놀라움 일 수 있습니다. 제 생각에는 'unsigned short'는 더 많은 타이핑 노력이 필요합니다. 그리고 그것은 항상 <s> byte </ s> 옥텟에 'unsigned char'를 사용하여 나를 슬프게했습니다. 서명되지 않은 문자, 정말?
Amomum

2
@Mehrdad 요점은 당신이 정말로 확신 할 수 없다는 것입니다. 그것이 바로 stdint.h발명 된 이유 입니다.
glglgl jul.

1
@glglgl : 문제를 살펴볼 수있는 또 다른 방법이 있습니다. 정확히 잘못된 질문을하지 않습니까? 여러 시스템을 대상으로하는 경우 처음에 비트 수를 코드에 임의로 하드 코딩하는 이유는 무엇입니까? 즉, sizeof(int) * CHAR_BIT(예를 들어) 말하고 사용하지 않는 이유 는 무엇입니까? int범위 (예 : 배열 인덱스)를 나타내기에는 너무 작 다면 int어쨌든 사용해서는 안되지만 size_t. 왜 int32더 말이 되겠습니까? 말이 폭 고정 유일한 시간 ... 시스템 간의 통신 (예를 들면, 파일 / 네트워크 포맷)에 대한 인
user541686

1
@Mehrdad 아니요. 때로는 저장해야하는 값 (예 : ADC 또는 기타)이 있습니다. 나는 그들이 16 비트 너비라는 것을 알고 있습니다. 따라서 사용하는 가장 좋은 방법은 uint16_t(또는 그 fast또는 least변형)입니다. 내 요점은 : 이러한 유형은 사용하기 편리하고 존재 이유가 있습니다.
glglgl jul.

1
@Mehrdad : 양질의 코드를 생성하기 위해 노력할 가치가 있다고 가정하면 내 API / 나머지 코드와 상호 작용하는 방법을 의미 하는 고유 한 함수형 typedef를 정의하고 다음과 같은 측면에서 기술적 인 근거로 정의 해야한다고 제안합니다. size_t및 / 또는 과 같은 "기술적"typedef uint64_t.
PJTraill

답변:


80

stdint.h이 라이브러리가 개발 될 당시에는 존재하지 않았습니다. 그래서 각 라이브러리는 자체 typedefs를 만들었습니다 .


4
그리고 좋습니다. stdint.h가 부족한 것이 좋은 이유라고 생각합니다.하지만 오늘날에도 이러한 typedef가 stdint 유형을 넘어서는 것이 아니라 int, long 등이 아닌 이유는 무엇입니까? 적어도 교환 가능하게 만들 것입니다
Amomum

25
@Amomum "왜 Glib (Linux에서 개발)가 Linux typedef를 사용하지 않았습니까?" glib의 "홈베이스"는 확실히 Linux이지만 디자인 상 이식 가능한 라이브러리입니다. 고유 한 유형을 정의하면 이식성이 보장됩니다. 라이브러리 유형을 적절한 각 대상 플랫폼 유형에 일치시키는 작은 헤더 만 조정하면됩니다.
피터 - 분석 재개 모니카

3
@Amomum Why Glib (리눅스에서 개발 됨) ... 아니요, 그렇지 않았습니다. 입심이 생성 된 방법을 리눅스 커널 전에.
andy256 jul.

5
@ andy256 "GLib"는 "glibc"의 줄임말이 아닙니다. gtk에서 분리 된 라이브러리입니다. Linux보다 오래되지 않았습니다.

2
@ andy256 : glib는 1998, Linux는 1991입니다. IOW, GLib는 Linux 이후 에 만들어졌습니다 .
MSalters

40

이전 라이브러리의 경우 문제의 헤더 ( stdint.h)가 존재하지 않았기 때문에 필요 합니다.

그러나 여전히 문제가 있습니다. 이러한 유형 ( uint64_t및 기타)은 표준 의 선택적 기능 입니다. 따라서 준수하는 구현은 함께 제공되지 않을 수 있으며 따라서 오늘날에도 라이브러리가 여전히 포함하도록 강제합니다.


14
uintN_t유형은 선택 사항이지만 uint_leastN_tuint_fastN_t유형이 없습니다.
Kusalananda

7
@Kusalananda : 슬프게도 유용성이 제한되어 있습니다.
궤도에서 가벼운 경주

16
그들이 선택적입니다 물론 이유 당신이 보장되지 않는다는 것입니다 수 있습니다 비트 정확히 그 수와 종류의 정수입니다. C는 여전히 다소 이상한 정수 크기의 아키텍처를 지원합니다.
celtschk

5
@LightnessRacesinOrbit : 유용성이 어떻게 제한되어 있습니까? 하드웨어 인터페이스를 제외하고는 모든 값을 맞추기 위해 최소가 아닌 정확한 비트 수가 필요한 이유를
모르겠습니다

23
@Amomum 구현에 요구 사항을 충족하는 유형이있는 경우 typedef 필요합니다. "그러나 구현에서 너비가 8, 16, 32 또는 64 비트 인 정수 유형을 제공하는 경우 패딩 비트가없고 (서명 된 유형의 경우) 2의 보수 표현은 대응하는 typedef 이름을 정의해야합니다. " (N1570에서 인용, 7.20.1.1 "정확한 너비 정수 유형") 따라서 표준 라이브러리에 이러한 유형이 없으면 타사 라이브러리도있을 수없는 것 같습니다.
Eric M Schmidt

13

stdint.h 1999 년부터 표준화되었습니다. 많은 애플리케이션이 기본 머신 아키텍처로부터 부분적 독립성을 유지하기 위해 유형을 정의 (효과적으로 별칭) 할 가능성이 높습니다.

개발자는 애플리케이션에 사용되는 유형이 언어 표준 또는 컴파일러 구현과 일치하지 않을 수있는 동작에 대한 프로젝트 별 가정과 일치한다는 확신을줍니다.

이 관행은 객체 지향 Façade 디자인 패턴에 반영되며 가져온 모든 라이브러리에 대해 항상 래퍼 클래스를 작성하는 개발자에 의해 많은 악용을받습니다.

컴파일러가 훨씬 덜 표준이고 머신 아키텍처가 16 비트, 18 비트 에서 36 비트 워드 길이 메인 프레임 까지 다양 할 수있는 경우 이것은 훨씬 더 많은 고려 사항이었습니다. 32 비트 ARM 임베디드 시스템으로 수렴하는 세계에서는이 관행이 훨씬 덜 중요합니다. 홀수 메모리 맵 이있는 저가형 마이크로 컨트롤러의 경우 여전히 우려 사항입니다 .


1
물론 stdint.h1999 년부터 표준화되었지만 실제로 얼마나 오래 사용할 수 있었습니까? 사람들은 새로운 표준을 구현하고 채택하는 데 발을 뗀다. 그 긴 과도기 동안에는 여전히 오래된 방법이 필수입니다.
Siyuan 르네

1
한 가지 불쾌한 잡았다는 stdint.h도 예를 들어 플랫폼이다 long과는 int32_t동일한 크기와 표현이,를 캐스팅하는 것이 요구 사항이 없습니다 int32_t*long*에 액세스 안정적으로 할 수있는 포인터를 얻을 것가 int32_t. 나는 표준의 저자가 레이아웃 호환 유형이 별칭과 호환되어야한다는 것을 명백히 생각했다고 믿을 수 없지만 gcc 및 IIRC clang의 작성자는 별칭을 무시하면 언어가 향상 될 것이라고 생각하지 않았기 때문에 명백한 경우.
supercat 2016-07-25

2
@supercat - 즉 때문에 C위원회에 에라타로 아마 가치가 제출는 ...의 무상 바보는 , 약간을 넣어
LThode

@LThode : C위원회가 실수로 clang 및 gcc의 동작을 둔감하다고 공식적으로 선언해야한다는 사실을 인정합니다. 그럴 거라고 생각하세요? 예상 할 수있는 최선의 방법은 프로그램이 "앨리어싱 모드"를 지정하는 방법을 정의하는 것입니다. 프로그램이 매우 엄격한 앨리어싱 규칙을 받아 들일 수 있다고 지정하면 컴파일러는이를 사용하여 현재 가능한 것 이상의 최적화를 허용 할 수 있습니다. 그것은 다소 프로그래머 친화적 본 것보다 규칙 ... 필요로하는 프로그램을 지정하는 경우
supercat

...하지만 여전히 많은 유용한 최적화를 허용한다면 컴파일러는에서 가능한 것보다 훨씬 더 효율적인 코드를 생성 할 수 -fno-strict-alias있지만 실제로는 여전히 작동합니다. 기존 코드 기반이 없더라도 애플리케이션마다 요구 사항이 다르기 때문에 단일 규칙 집합이 모든 애플리케이션에 대한 최적화 및 의미 체계의 최적 균형을 맞출 수 없습니다. 기존 코드베이스에 추가하고 다른 모드에 대한 필요성이 명확해야합니다.
supercat

3

그래서 당신은 typedef char to int.

한 "코딩 공포"는 한 회사 헤더에 프로그래머가 부울 값을 원하고 char이 작업에 대한 논리적 네이티브 유형이라는 지점이 있다고 언급하여 typedef bool char. 그런 다음 나중에 누군가가 정수가 가장 논리적 인 선택임을 발견하고 typedef bool int. 유니 코드 이전의 결과는 사실상typedef char int .

미래 지향적이고 미래 지향적 인 호환성이 상당히 많다고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.