Collections-C는 C 언어의 일반 데이터 구조 라이브러리입니다.
void*
형식으로 데이터를 저장하는 구조입니다.
컨테이너 | 설명 |
---|---|
CC_Array | 요소가 추가되면 자동으로 확장되는 동적 배열입니다. |
CC_List | 이중 연결 목록. |
CC_SList | 단일 연결 리스트. |
CC_Deque | 양쪽 끝에서 상각된 상수 시간 삽입 및 제거와 상수 시간 액세스를 지원하는 동적 배열입니다. |
CC_HashTable | 순서가 지정되지 않은 키-값 맵입니다. 최선의 경우 상각된 상수 시간 삽입, 제거 및 값 조회를 지원합니다. |
CC_TreeTable | 순서가 지정된 키-값 맵입니다. 로그 시간 삽입, 제거 및 값 조회를 지원합니다. |
CC_HashSet | 정렬되지 않은 세트입니다. 조회, 삭제, 삽입은 상각 상수 시간에 수행되며, 최악의 경우 상각 선형 시간에 수행됩니다. |
CC_TreeSet | 주문한 세트입니다. 조회, 삭제, 삽입은 로그 시간으로 수행됩니다. |
CC_Queue | FIFO(선입선출) 구조입니다. 지속적인 삽입, 제거 및 조회를 지원합니다. |
CC_Stack | LIFO(후입선출) 구조입니다. 지속적인 삽입, 제거 및 조회를 지원합니다. |
CC_PQueue | 우선순위 큐. |
CC_RingBuffer | 링 버퍼. |
CC_TSTTable | 삼항 검색 트리 테이블. 삽입, 검색, 반복, 삭제를 지원합니다. |
int value = 20 ;
CC_Array * array ;
if ( cc_array_new ( & array ) != CC_OK ) { /*Create a new array.*/
// handle error
}
if ( cc_array_add ( & array , ( void * ) & value ) != CC_OK ) { /* Add the pointer to the value to the array */
// handle error
}
임의 길이의 데이터를 직접 저장하는 구조입니다.
컨테이너 | 설명 |
---|---|
CC_ArraySized | 요소가 추가되면 자동으로 확장되는 동적 배열입니다. |
int value = 20 ;
CC_SizedArray * array ;
if ( cc_sized_array_new ( sizeof ( int ), & array ) != CC_OK ) { /* Create a new array that stores values the size of an int*/
// handle error
}
if ( cc_sized_array_add ( & array , & value ) != CC_OK ) { /* Copy the value into the array */
// handle error
}
메모리 풀은 사전 할당된 연속 메모리 블록입니다.
컨테이너 | 설명 |
---|---|
CC_DynamicPool | 힙에서 잠재적으로 확장 가능한 메모리 풀 |
CC_StaticPool | 고정 풀 |
/* CC_StaticPool can enable the use of the structures on the stack */
#include "memory/cc_static_pool.h"
#include "cc_list.h"
CC_StaticPool * pool ;
// Alloc wrappers
void * pool_malloc ( size_t size ) { cc_static_pool_malloc ( size , pool );}
void * pool_calloc ( size_t count , size_t size ) { cc_static_pool_calloc ( count , size , pool );}
void pool_free ( void * ptr ) { cc_static_pool_free ( ptr , pool );}
int main ( int argc , char * * argv ) {
uint8_t buffer [ 2000 ]; /* Large enough buffer. */
cc_static_pool_new ( sizeof ( buffer ), 0 , buffer , buffer , & pool ); /* allocate the pool structure inside the buffer */
CC_ListConf conf ; /* Create a new list config */
cc_list_conf_init ( & conf );
conf . mem_alloc = pool_malloc ; /* Set list memory allocators to pool allocators */
conf . mem_calloc = pool_calloc ;
conf . mem_free = pool_free ;
CC_List * list ;
cc_list_new_conf ( & conf , & list ); /* The newly created list will be allocated inside the "buffer" array*/
// Use the list
return 0 ;
}
이러한 패키지는 일반적으로 배포판 패키지 관리자를 통해 설치할 수 있습니다.
프로젝트를 빌드하려면 먼저 별도의 빌드 디렉터리를 만들어야 합니다(아직 없는 경우).
mkdir build
이 디렉터리에서 cmake
명령을 실행하고 빌드를 구성할 수 있습니다.
cmake ..
또는 cmake -DSHARED=True
Collections-C 빌드를 공유 라이브러리로 만들기cmake -DSHARED=False
정적 라이브러리를 빌드합니다. cmake
makefile 생성을 완료하면 빌드 디렉터리 내에서 make
실행하여 라이브러리를 빌드할 수 있습니다.
정적 라이브러리 복제 및 구축의 예:
git clone https://github.com/Collections-C.git
cd Collections-C
mkdir build
cd build
cmake -DSHARED=False
make
테스트를 실행하려면( build
디렉터리에서):
make test
개별 테스트를 실행하려면 적절한 실행 파일을 실행하면 됩니다. 예를 들어:
build/test/array_test
라이브러리를 설치하려면 다음을 실행하세요.
sudo make install
기본적으로 라이브러리와 헤더는 /usr/local/lib/
및 /usr/local/include
디렉터리에 설치됩니다.
동적으로 링크된 애플리케이션을 실행할 수 있으려면 시스템의 런타임이 새 라이브러리의 위치를 인식하도록 해야 합니다. /etc/ld.so.conf
에 설치 디렉터리가 포함되어 있으면 다음 명령을 실행하는 것만큼 간단할 수 있습니다.
참고: macOS는 ldconfig를 지원하지 않습니다.
sudo ldconfig
이미 라이브러리를 구축하고 설치했다면 간단한 hello world 프로그램을 작성하여 hello.c
라는 파일에 저장할 수 있습니다.
#include <stdio.h>
#include <collectc/cc_array.h>
int main ( int argc , char * * argv ) {
// Create a new array
CC_Array * ar ;
cc_array_new ( & ar );
// Add a string to the array
cc_array_add ( ar , "Hello World!n" );
// Retreive the string and print it
char * str ;
cc_array_get_at ( ar , 0 , ( void * ) & str );
printf ( "%s" , str );
return 0 ;
}
이제 프로그램을 컴파일하고 링크해야 합니다. make
정적 라이브러리와 동적 라이브러리를 모두 구축하므로 프로그램에 연결할 라이브러리를 선택할 수 있습니다.
라이브러리를 프로그램에 정적으로 연결하려면 -static
플래그를 컴파일러에 전달할 수 있습니다.
참고: macOS에서 -static
플래그는 그다지 친숙하지 않습니다(모든 라이브러리가 정적으로 링크되어야 함). 따라서 -static -lcollectc
정적 라이브러리의 전체 경로로 바꿀 수 있습니다. 기본적으로 /usr/local/lib/libcollectc.a
입니다.
gcc hello.c -static -lcollectc -o hello
또는 clang으로 컴파일할 때와 비슷하게:
clang hello.c -static -lcollectc -o hello
그러면 라이브러리를 실행 파일에 복사하여 링크합니다. Collections-C를 런타임 종속성 으로 사용하고 싶지 않은 경우 이 옵션을 사용할 수 있지만 이로 인해 더 큰 실행 파일을 생성하는 비용이 발생합니다.
런타임 시 동적으로 라이브러리와 연결하도록 선택할 수도 있습니다. -static
컴파일러 플래그를 생략하는 경우의 기본 동작은 다음과 같습니다.
gcc hello.c -lcollectc -o hello
또는 clang으로:
clang hello.c -lcollectc -o hello
동적으로 연결하면 더 작은 실행 파일이 생성되지만 프로그램이 실행될 모든 시스템에 libcollectc.so
있어야 합니다.
때로는 컴파일러가 라이브러리나 헤더를 찾는 데 문제가 있을 수 있습니다. 이는 일반적으로 잘못된 디렉토리에서 해당 항목을 찾기 때문에 발생하며, 이는 라이브러리나 헤더 또는 둘 다 비표준 디렉토리에 설치되었거나 전혀 설치되지 않은 경우 발생할 수 있습니다.
이 경우 -I[path to headers]
및 -L[path to libraries]
옵션을 전달하여 컴파일러에 이를 찾을 위치를 명시적으로 알릴 수 있습니다.
gcc hello.c `pkg-config --cflags --libs collectionc` -o hello
모든 것이 컴파일에 잘 되었다면 실행 파일을 실행할 수 있습니다:
./hello
그러면 Hello, World!
가 인쇄되어야 합니다. 콘솔에.
기여를 환영합니다.
기능 요청이 있거나 버그를 발견한 경우 언제든지 새 이슈를 열어주세요. 코드에 기여하고 싶다면 CONTRIBUTING.md에서 자세한 내용을 확인하세요.