Z trudem znajduję pragmatyczne porady w świecie rzeczywistym dotyczące konwencji nazewnictwa funkcji dla średniej wielkości projektu biblioteki C. Mój projekt biblioteczny jest podzielony na kilka modułów i podmodułów z własnymi nagłówkami i luźno podąża za stylem OO (wszystkie funkcje przyjmują pewną strukturę jako pierwszy argument, brak globałów itp.). Położyliśmy nasze coś takiego:
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
Zasadniczo funkcje są o wiele za duże, aby (na przykład) trzymać some_foo_action
i another_foo_action
w jednym foo.c
pliku implementacji ustawić większość funkcji w trybie statycznym i nazwać to dniem.
Mogę poradzić sobie z usuwaniem symboli wewnętrznych („modułu prywatnego”) podczas tworzenia biblioteki, aby uniknąć konfliktów dla moich użytkowników z ich programami klienckimi, ale pytanie brzmi: jak nazwać symbole w mojej bibliotece? Do tej pory robiłem:
struct MyLibFoo;
void MyLibFooSomeAction(MyLibFoo *foo, ...);
struct MyLibBar;
void MyLibBarAnAction(MyLibBar *bar, ...);
// Submodule
struct MyLibFooBaz;
void MyLibFooBazAnotherAction(MyLibFooBaz *baz, ...);
Ale kończę na szalonych długich nazwach symboli (znacznie dłuższych niż w przykładach). Jeśli nie poprzedzę tych nazw „fałszywą przestrzenią nazw”, nazwy symboli wewnętrznych modułów będą się kolidować.
Uwaga: nie obchodzi mnie skrzynka na camelcase / Pascal itp., Same nazwy.
źródło
git merge
ing. Jako przykład mam moduł do rysowania UI z OpenGL, i mają oddzielne.c
pliki dla każdego elementu, który muszę (slider.c
,indicator.c
etc). Te implementacje elementów mają główną funkcję rysunkową o długości może kilkuset linii i znaczną liczbęstatic
pomocników. Wywołują także kilka funkcji czystej geometrii z poziomu modułu interfejsu użytkownika. Czy to brzmi dość typowo?Audio Module > Engines > Channels > Filters
co znaczy coś w rodzajuMyLibAudioEngines<EngineName>Channel<ActionName>
. Lub w moim podmodule filtrów:MyLibAudioFilters<FilterName><Type><Action>
np.MyLibAudioFiltersBigSoundingCompressorFloat32Process
Zwykłą konwencją dla bibliotek C jest użycie nazwy biblioteki jako prefiksu dla nazw używanych zewnętrznie, np
W przypadku wewnętrznych nazw bibliotek, które muszą być nadal dostępne w wielu jednostkach biblioteki, nie ma ścisłej konwencji, ale użyłbym prefiksu nazwy biblioteki i wskazania, że jest to funkcja wewnętrzna. Na przykład:
Zgadzam się, że może to prowadzić do dość długich i trudnych do wpisania nazw, ale niestety taką cenę musimy zapłacić za brak mechanizmu takiego jak przestrzenie nazw C ++. Aby skrócić długość nazwisk, kosztem pewnej przejrzystości, możesz zdecydować się na użycie skrótów w swoich nazwach, ale musisz dokładnie rozważyć zalety i wady.
źródło
Jeśli chcesz uniknąć długich prefiksów, możesz skrócić nazwy bibliotek, takie jak to, co robi Apple w iOS i OS X:
źródło
A co z globalną zmienną struktury wypełnioną wskaźnikami funkcji?
lib.h
lib.c:
Uprząż:
Statyczne słowo kluczowe ogranicza zakres do jednostki tłumaczącej, więc nie będzie kolidować z innymi.
Użytkownik może następnie skrócić go za pomocą wskaźnika podobnego do
YourApi *ya = &yourApi
, a następnie za pomocąya->doFoo(...)
.Zapewnia również dobry sposób na wyśmiewanie biblioteki do testowania.
źródło