Machen Sie die Funktion nur innerhalb einer Bibliothek sichtbar, nicht in der API
Ich schreibe eine C99-Bibliothek, die auf mehrere Dateien verteilt ist, z
// 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();
}
Ich möchte nur die API_
gelegten Funktionen durch ein Programm sichtbar sein , die Bibliothek, aber ich muß auch aussetzen my_private_fn
in , core.h
um durch verwendet zu werden module_a.c
. Gibt es in C eine Möglichkeit, my_private_fn
nur innerhalb der Bibliothek sichtbar zu machen ?
Antworten
Wenn die Funktion nur in der Kompilierungseinheit sichtbar sein muss, in der sie definiert ist, können Sie sie deklarieren static
. Da die Sprache C nur wenige mögliche Bereiche bietet: Ein Symbol kann nur drei Bereiche haben:
- lokal zu einem Block (der Block kann eine Funktion oder ein Block innerhalb einer Funktion sein)
- statischer Bereich (statische Deklaration außerhalb einer Funktion): Das Symbol ist nur in der Kompilierungseinheit sichtbar, in der es deklariert ist
- globaler Bereich (nicht statische Deklaration außerhalb einer Funktion): Das Symbol ist im gesamten Programm sichtbar.
Sie können die Deklaration höchstens in einer privaten Include-Datei ausblenden, die Sie in der offiziellen dokumentierten API nicht deklarieren. Auf diese Weise sollten gehorsame Benutzer es nicht verwenden. Sie können jedoch nicht verhindern, dass Benutzer die Deklaration in ihren eigenen Code einfügen und die Funktion verwenden.
Fügen Sie sie in eine interne Header-Datei ein, die nur in der Bibliothek verwendet und nicht an Endbenutzer verteilt wird core_internal.h
.
Ich habe einen besseren Weg gefunden, meinen Code auf der Grundlage der von mir ausgewählten Antwort von Serge zu gestalten, deren größter Verdienst darin besteht.
Der Schlüssel besteht darin, die "privaten" Funktionen in Header einzufügen, die nur in C-Dateien enthalten sind, nicht in Header-Dateien. Auf diese Weise sind die "privaten" Symbole intern verfügbar, jedoch nicht für einen externen Anrufer. In einem vollständigen Beispiel:
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();
}
Und wenn wir wollen, können wir möglicherweise mehrere Module in einem gemeinsamen Bibliotheksheader gruppieren.
library.h
::
#include "module_a.h"
// etc.
Auf diese Weise muss ein Programm, das die Bibliothek verwendet, nur eine Datei enthalten, die nur Folgendes enthält:
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;
}
Kompilieren mit gcc -Wall *.c -o main.o
und Ausführen von ./main.o
Erträgen:
Public function called.
Private function called.
Public function called.