API가 아닌 라이브러리 내에서만 함수를 표시합니다.

Nov 29 2020

여러 파일에 배포되는 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_fnin 도 노출해야합니다 . C 에서 라이브러리 내에서만 볼 수 있는 방법이 있습니까?core.hmodule_a.cmy_private_fn

답변

3 SergeBallesta Nov 29 2020 at 01:39

함수가 정의 된 컴파일 단위에서만 표시되어야하는 경우 선언 할 수 있습니다 static. C 언어는 가능한 범위를 거의 제공하지 않기 때문에 심볼은 3 개의 범위 만 가질 수 있습니다.

  • 블록에 로컬 (블록은 함수 또는 함수 내부의 블록 일 수 있음)
  • 정적 범위 (함수 외부의 정적 선언) : 심볼은 선언 된 컴파일 단위에서만 볼 수 있습니다.
  • 전역 범위 (함수 외부의 비 정적 선언) : 기호는 전체 프로그램에서 볼 수 있습니다.

기껏 해야 공식 문서화 된 API에서 선언하지 않은 개인 포함 파일에서 선언을 숨길 수 있습니다 . 그렇게하면 순종하는 사용자는 사용하지 않아야합니다. 그러나 사용자가 자신의 코드에 선언을 넣고 함수를 사용하는 것을 막을 수는 없습니다.

2 JohnKugelman Nov 29 2020 at 01:35

라이브러리 내에서만 사용되며 최종 사용자에게 배포되지 않는 내부 헤더 파일 (예 : core_internal.h.

user3758232 Dec 31 2020 at 00:19

나는 내가 선택한 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.