2009-12-03 5 views
2

공용 API에서 사용되는 데이터 형식에 대해 라이브러리를 작성하고 모범 사례가 무엇인지 궁금합니다. 공용 C++ API 형식

일부 내부 배열/컨테이너에 대한 인덱스를 예상하는 기능

void foo (int bar) 

주어. 어떤 유형이어야 하는가? 인덱스는 음수가 될 수 없으므로 unsigned int 또는 size_t를 사용할 수 있습니다. 아니면 무언가 잘못된 값이 제공되면 일반 int 및 어설 션/던져 스틱해야합니까?

일반적으로 유효한 데이터 범위 (예 : 부정적인 체크를 피함)에 따라 유형을 선택해야하나요?

EDIT : 다른 예로, 내 라이브러리가 파일 인쇄 기능을 제공한다고 가정합니다. 사용자는 페이지의 범위를 인쇄하도록 선택할 수 있습니다

void print (int page_from, int page_to) 

답변

2

당신이 말하는 배열/컨테이너가 일반적인 추상 응용 프로그램 독립 배열 인 경우 가장 적합한 유형은 size_t입니다. 물론 인터페이스의 유형에 대해 typedef 이름을 제공 할 수 있습니다. 다시 말하지만, 일반적인 컨테이너 라이브러리 나 일반 정렬 함수 등 추상 배열을 사용하는 경우에만 적합합니다.

응용 프로그램 특정 영역에 들어가면 size_t은 더 이상 적절한 유형이 아닙니다. 응용 프로그램 특정 영역에서 색인은 일] 적으로 배열과 관련이없는 일부 응용 프로그램 특정 의미를가집니다. 예를 들어, 일종의 "직원 ID"또는 "셀 번호"또는 "색상 색인"또는 다른 것일 수 있습니다. 이 경우 해당 수량을 나타 내기 위해 일반적으로 이미 미리 선택된 정수 유형이 있습니다. (그리고 배열은 일반적으로 배열과 관련이 없습니다.) 이것은 인터페이스에서 사용해야하는 유형입니다.

signed/unsignedness에 관해서는 ... 서명 된 수량을 부호없는 유형으로 나타내야한다고 생각합니다. 즉, 일반 배열 색인은 부호가 없어야합니다.

+0

+1 : 숫자가 나타내는 것으로 가정되는 양에 대한 typedef를 만듭니다. – avakar

1

여기에 최고의 조언은 아마도 기존의 관행과 이동하는 것 (즉, 어떤 C++ 표준 라이브러리가 할). 대체로 이것은 적어도 unsigned 유형을 사용한다는 것을 의미합니다. 배열/포인터 인덱스로 그 타입을 직접 사용한다면 (그리고 그 추상화는 투명하다), size_t을 호출 할 수있다.

foo이 일부 컨테이너와 같은 클래스의 멤버 함수 인 경우 typedefsize_type과 같이 입력하여 사용해도됩니다.

0

부호없는을 사용하여 투표했습니다. 심지어 stdint.h를 사용하고 uint32_t와 같은 것을 사용하십시오.

+0

C++에는 'stdint.h'가 없으며 고정 크기 유형을 사용하는 것이 잘못되었습니다. 2 ** 32 개 이상의 요소가있는 배열을 가질 수 있습니다. (누가 640kB 메모리로 충분하다고 말 했나요?) – avakar

+0

32 비트 정수를 사용하지 말고 uint64_t를 사용할 수도 있습니다. 변수의 크기를 알기를 제안합니다. – Drakosha

+1

링크를 가져 주셔서 감사합니다. 앞서 말했듯이 C++에는'stdint.h '가 없습니다. :) (C99에 추가되었으며 현재 C++ 표준은 C90을 기반으로합니다 .C++ 표준의 다음 개정판은'stdint.h'를 소개합니다. 적어도 하나의 주요 C++ 컴파일러는 아직 지원하지 않습니다 - msvc). 어쨌든 변수의 크기를 수정하는 것이 좋지 않다고 생각합니다. 특히 메모리에서 인덱스 나 크기를 참조하는 경우 (모든 한계를 넘어서 성장하는 경향이있는 경우) 특히 그렇습니다.나는 우리 모두가 64 비트 붐 동안이 교훈을 배웠다고 생각했다. – avakar

관련 문제