Ich kämpfe darum, pragmatische Ratschläge zu Funktionsnamenkonventionen für ein mittelgroßes C-Bibliotheksprojekt zu finden. Mein Bibliotheksprojekt ist in einige Module und Submodule mit eigenen Kopfzeilen unterteilt und folgt lose einem OO-Stil (alle Funktionen haben eine bestimmte Struktur als erstes Argument, keine globalen Elemente usw.). Es ist unser etwas gelegt wie:
MyLib
- Foo
- foo.h
- foo_internal.h
- some_foo_action.c
- another_foo_action.c
- Baz
- baz.h
- some_baz_action.c
- Bar
- bar.h
- bar_internal.h
- some_bar_action.c
Im Allgemeinen sind die Funktionen viel zu groß , um (zum Beispiel) Stick some_foo_action
und another_foo_action
in einer foo.c
Implementierungsdatei, machen die meisten Funktionen statisch, und nennen ihn einen Tag.
Ich kann beim Erstellen der Bibliothek die internen ("privaten") Symbole entfernen, um Konflikte für meine Benutzer mit ihren Client-Programmen zu vermeiden. Die Frage ist jedoch, wie Symbole in meiner Bibliothek benannt werden sollen. Bisher habe ich getan:
struct MyLibFoo;
void MyLibFooSomeAction(MyLibFoo *foo, ...);
struct MyLibBar;
void MyLibBarAnAction(MyLibBar *bar, ...);
// Submodule
struct MyLibFooBaz;
void MyLibFooBazAnotherAction(MyLibFooBaz *baz, ...);
Aber am Ende habe ich verrückte lange Symbolnamen (viel länger als die Beispiele). Wenn ich den Namen keinen "falschen Namespace" voranstelle, stoßen die internen Symbolnamen der Module aufeinander.
Hinweis: Ich interessiere mich nicht für Camelcase / Pascal usw., nur für die Namen selbst.
quelle
git merge
Verwaltung. Als Beispiel habe ich ein Modul zum Zeichnen von UI mit OpenGL und ich habe separate.c
Dateien für jedes Element, das ich brauche (slider.c
,indicator.c
etc). Diese Elementimplementierungen haben eine Hauptzeichnungsfunktion, die möglicherweise einige hundert Zeilen lang ist, und eine angemessene Anzahl vonstatic
Helfern. Sie rufen auch einige reine Geometriefunktionen innerhalb des UI-Moduls auf. Klingt das ziemlich typisch?Audio Module > Engines > Channels > Filters
die so etwas wie bedeutetMyLibAudioEngines<EngineName>Channel<ActionName>
. Oder in meinem Filtersubmodul:MyLibAudioFilters<FilterName><Type><Action>
zB.MyLibAudioFiltersBigSoundingCompressorFloat32Process
Die übliche Konvention für C-Bibliotheken besteht darin, den Bibliotheksnamen als Präfix für extern verwendbare Namen zu verwenden, z
Für bibliotheksinterne Namen, auf die in mehreren Einheiten der Bibliothek noch zugegriffen werden muss, gibt es keine strenge Konvention, aber ich würde ein Präfix des Bibliotheksnamens und einen Hinweis darauf verwenden, dass es sich um eine interne Funktion handelt. Beispielsweise:
Ich stimme zu, dass dies zu Namen führen kann, die ziemlich lang und schwer zu tippen sind, aber leider ist dies der Preis, den wir dafür zahlen müssen, dass wir keinen Mechanismus wie C ++ - Namespaces haben. Um die Länge der Namen zu verringern, können Sie auf Kosten der Klarheit Abkürzungen in Ihren Namen verwenden, aber Sie müssen die Vor- und Nachteile sorgfältig abwägen.
quelle
Wenn Sie lange Präfixe vermeiden möchten, können Sie Bibliotheksnamen wie die von Apple in iOS und OS X abkürzen:
quelle
Was ist mit einer globalen Strukturvariablen, die vorab mit Funktionszeigern gefüllt ist?
lib.h
lib.c:
Geschirr:
Das statische Schlüsselwort begrenzt den Bereich auf die Übersetzungseinheit, damit es nicht mit anderen kollidiert.
Der Benutzer kann es dann verkürzen, indem er einen Zeiger wie
YourApi *ya = &yourApi
folgt verwendetya->doFoo(...)
.Es bietet auch eine gute Möglichkeit, Ihre Bibliothek zum Testen zu verspotten.
quelle