API가 아닌 라이브러리 내에서만 함수를 표시합니다.
여러 파일에 배포되는 C99 라이브러리를 작성하고 있습니다.
// core.h
void my_private_fn();
void API_my_public_fn();
// core.c
#include "core.h"
void my_private_fn() {
do_something();
}
void API_my_public_fn() {
do_something_else();
}
// module_a.h
#include "core.h"
void API_useful_thing();
// module_a.c
#include "module_a.h"
void API_useful_thing() {
my_private_fn();
}
API_
라이브러리를 사용하는 프로그램 에서 접두어가 붙은 함수 만 보이기를 원하지만 에서 사용하려면 my_private_fn
in 도 노출해야합니다 . C 에서 라이브러리 내에서만 볼 수 있는 방법이 있습니까?core.h
module_a.c
my_private_fn
답변
함수가 정의 된 컴파일 단위에서만 표시되어야하는 경우 선언 할 수 있습니다 static
. C 언어는 가능한 범위를 거의 제공하지 않기 때문에 심볼은 3 개의 범위 만 가질 수 있습니다.
- 블록에 로컬 (블록은 함수 또는 함수 내부의 블록 일 수 있음)
- 정적 범위 (함수 외부의 정적 선언) : 심볼은 선언 된 컴파일 단위에서만 볼 수 있습니다.
- 전역 범위 (함수 외부의 비 정적 선언) : 기호는 전체 프로그램에서 볼 수 있습니다.
기껏 해야 공식 문서화 된 API에서 선언하지 않은 개인 포함 파일에서 선언을 숨길 수 있습니다 . 그렇게하면 순종하는 사용자는 사용하지 않아야합니다. 그러나 사용자가 자신의 코드에 선언을 넣고 함수를 사용하는 것을 막을 수는 없습니다.
라이브러리 내에서만 사용되며 최종 사용자에게 배포되지 않는 내부 헤더 파일 (예 : core_internal.h
.
나는 내가 선택한 Serge의 대답을 바탕으로 내 코드 빌드를 깔끔하게 배치하는 방법을 찾았습니다.
핵심은 헤더 파일이 아닌 C 파일에만 포함 된 헤더에 "개인"기능을 배치하는 것입니다. 이렇게하면 "개인"기호를 내부적으로 사용할 수 있지만 외부 호출자는 사용할 수 없습니다. 완전한 예에서 :
core.h
:
void my_public_fn();
core_priv.h
:
void my_private_fn();
core.c
:
#include <stdio.h>
#include "core.h"
#include "core_priv.h"
void my_private_fn() {
printf("Private function called.\n");
}
void my_public_fn() {
printf("Public function called.\n");
}
module_a.h
:
#include "core.h"
void module_a_fn();
module_a.c
:
#include "core_priv.h"
#include "module_a.h"
void module_a_fn() {
my_private_fn();
my_public_fn();
}
그리고 원한다면 공통 라이브러리 헤더에 여러 모듈을 그룹화 할 수 있습니다.
library.h
:
#include "module_a.h"
// etc.
이렇게하면 라이브러리를 사용하는 프로그램은 다음과 같은 파일 하나만 포함하면됩니다.
main.c
:
#include "library.h"
int main() {
//my_private_fn(); // This triggers a compile warning.
my_public_fn(); // I can still reach the "core" public function.
module_a_fn(); // This calls the "private" function internally.
return 0;
}
컴파일 gcc -Wall *.c -o main.o
및 실행 결과 ./main.o
:
Public function called.
Private function called.
Public function called.