예제를 통해 내 제안을 확장하십시오.
라이브러리에는 최소한 두 개의 (적어도) 헤더 파일이 필요합니다. 라이브러리 사용자가 포함하는 공용 폴더와 라이브러리 원본 파일에만 포함되는 개인 파일이 필요합니다.
대중은 당신이 모두 공공 및 민간 헤더 파일 및 사용을 포함하여 라이브러리 소스 파일에서 다음
#pragma once
struct internal_structure
{
int fd;
// Other members as needed
...
};
// Possible function prototypes of private functions
전용 헤더 파일을 가지고
다음
#pragma once
// This is all that is needed to declare pointers to the internal structure
typedef struct internal_structure STRUCTURE;
// The public API of your library
STRUCTURE *lib_init(void);
void lib_cleanup(STRUCTURE *s);
...
같은 수 블랙 박스 구조에 대한 STRUCTURE
:
#include <stdlib.h>
#include "public.h"
#include "private.h"
STRUCTURE *lib_init(void)
{
STRUCTURE *s = malloc(sizeof *s);
s->fd = open(...);
// Other initialization
...
return s;
}
void lib_cleanup(STRUCTURE *s)
{
// Other cleanup
...
close(s->fd);
free(s);
}
그런 다음 라이브러리의 사용자는 공공 헤더 파일을 포함하고 잘 정의 된 API 사용
#include "public.h"
int main(void)
{
STRUCTURE *s = lib_init();
...
lib_cleanup(s);
return 0;
}
공공 기능 모두 유사 해당 인수, 일반적으로 자신의 첫 번째 인자의 하나로서 STRUCTURE *
를 취해야을 lib_cleanup
기능. 그런 다음이 함수는 원하는 방식으로 구조와 멤버를 사용할 수 있습니다.
일반적으로 정적 전역 변수를 사용하지 않아야합니다. 대신 필요한 모든 변수를 멤버로 포함하는 "블랙 박스"구조를 만들고 초기화 함수에서 포인터를 반환하는 것이 좋습니다. 예를 들어 C 표준 I/O 기능과 매우 유사합니다. 'fopen'은 정의되지 않은'FILE' 구조체에 대한 포인터를 리턴합니다. –
C에서 멤버로 필요한 모든 내부 변수를 어떤 방법으로 정의 할 수 있습니까? 나에게 이것은 번역 단위 전체에서 사용할 수 있지만 외부에서 가져올 수 없음을 의미합니다. 꽤 정적 인 전역 변수입니다. 맞습니까? – justynnuff
"블랙 박스"구조에 대한 좋은 점은 API 사용자가주의 할 필요없이 걱정없이 새로운 멤버를 추가하거나, 오래된 것을 삭제하거나, 기존의 변경 사항을 적용 할 수 있다는 것입니다. –