C ++ 라이브러리 API 디자인


12

나는 C ++ 라이브러리를위한 좋은 API 디자인, 공유 객체 / DLL 등을 배우기위한 좋은 자료를 찾고 있습니다. 좋은 API, 멋진 클래스, 템플릿 등을 소스 수준에서 작성하는 데는 많은 자료가 있지만 거의 아무것도 없습니다. 공유 라이브러리와 실행 파일로 구성 John Lakos의 Large-Scale C ++ Software Design과 같은 책은 흥미롭지 만 엄청난 구식입니다.

내가 찾고있는 것은 템플릿 처리에 대한 조언입니다. 내 API의 템플릿을 사용하면 종종 실행 파일 (또는 다른 라이브러리)의 라이브러리 코드로 끝나기 때문에 버그를 수정하면 새 라이브러리를 롤아웃 할 수는 없지만 해당 코드의 모든 클라이언트를 다시 컴파일하고 재배포해야합니다. (그렇습니다. 라이브러리 내부에서 가장 일반적인 버전을 인스턴스화하려고하는 등의 솔루션을 알고 있습니다.)

또한 C ++ 라이브러리에서 작업하는 동안 바이너리 호환성을 유지하기 위해 고려해야 할 다른 경고 및 사항을 찾고 있습니다.

그런 것들에 관한 좋은 웹 사이트 나 책이 있습니까?


sivut.koti.soon.fi/~terop/GameApi.html- 이 방법으로 처리했습니다. 즉, lib 내부에 템플릿이 있지만 api에는 없습니다.
tp1

1
std::unique_ptr아주 새로운 것입니다. 제안 된 API에 대해 적합 하다고 생각한 것은 무엇입니까 ? 예를 들어 누출 및 이중 삭제를 거의 보장하면서 모든 리소스를 수동으로 관리해야하는 방법은 무엇입니까? 또는 많은 유형의 문자가 한두 글자로 된 방식으로 목적을 구분하는 것이 불가능합니까?
DeadMG

1
@ tp1 :하지만 당신은 내가 그들을 처리했는지 보려고 신경 쓰지 않았습니다. 당신은 아무 것도하지 않고 "핸들 테마"라고 말했습니다. 나는 그들을 처리하지 않고 지금 무엇? 그러한 실수를 허용하지 않는 RAII 클래스를 사용하는 대신. 사용했다면 그런 unique_ptr코드를 작성할 수 없습니다.
DeadMG

1
@ tp1 : Env가 파괴 될 수 있음을 알았습니다. 거의 다됐다. 객체를 관리하는 기능이 전혀없는 것 같습니다. "내가 만든 모든 것"또는 "아무것도"보다 더 세분화 된 메모리를 관리하려면 내가 망친 것 같습니다.
DeadMG

3
확장 된 대화를 Software Engineering Chat으로 보내주십시오 . 질문이나 답변에 유용한 정보를 포함시킬 수 있습니까?
ChrisF

답변:



3

이것은 거의 불가능합니다. 간단한 사실은 때로는 작업을 수행하기 위해 컴파일러가 필요하다는 것입니다. 필요한 마술을 할 수는 없습니다. std::vector헤더 전용 라이브러리를 만들 수없는 기능은 없습니다 . 컴파일러는 많은 마법을 작동시킬 수 있지만, 호출하지 않으면 마법을 가질 수 없으며 이는 사실입니다.

수행 할 수있는 작업은 다음과 같습니다. 필요없는 템플릿은 사용하지 마십시오. 당신이 할 수없는 일이 있습니다 : 다른 것.

간단한 사실은 새 버전으로 다시 컴파일하는 것이 정적으로 유형이 지정된 라이브러리로 얻을 수있는 성능, 안전 및 기능의 장점에 비해 큰 부담이되지 않는다는 것입니다.


2
나는 생각해 볼만한 예로서 언급했다. 내가 찾고있는 것은 내가 준비해야 할 다른 유사한 문제에 대한 지침과 그 문제를 처리하는 모범 사례입니다.
johannes

글쎄, ABI- 호환성을 깨는 모든 새로운 버전이 새로운 인라인 네임 스페이스에 배치된다면, 그것이 헤더 전용 라이브러리인지 아닌지에 문제가 있습니까?
중복 제거기
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.