Jakie konwencje nazewnictwa są powszechnie używane w języku C? Wiem, że są co najmniej dwa:
- GNU / linux / K&R z funkcją lower_case_functions
- ? imię ? z funkcjami UpperCaseFoo
Mowa tutaj tylko o C. Większość naszych projektów to małe systemy wbudowane, w których używamy C.
Oto ten, którego zamierzam użyć w następnym projekcie:
C Naming Convention
Struct TitleCase
Struct Members lower_case or lowerCase
Enum ETitleCase
Enum Members ALL_CAPS or lowerCase
Public functions pfx_TitleCase (pfx = two or three letter module prefix)
Private functions TitleCase
Trivial variables i,x,n,f etc...
Local variables lower_case or lowerCase
Global variables g_lowerCase or g_lower_case (searchable by g_ prefix)
c
naming-conventions
JeffV
źródło
źródło
Odpowiedzi:
Najważniejsza jest tutaj konsekwencja. To powiedziawszy, kieruję się konwencją kodowania GTK +, którą można podsumować w następujący sposób:
MAX_BUFFER_SIZE
,TRACKING_ID_PREFIX
.GtkWidget
,TrackingOrder
.gtk_widget_show()
,tracking_order_process()
.GtkWidget *foo
,TrackingOrder *bar
._refrobnicate_data_tables()
,_destroy_cache()
.źródło
static
i pomijać przedrostek modułu, więc gdybygtk_widget_show()
była funkcją z zakresem plikowym, stałaby się po prostuwidget_show()
dodaną statyczną klasą pamięci._
celu wdrożenia i przyszłego wykorzystania. Istnieje kilka wyjątków od nazw zaczynających się od,_
ale moim zdaniem nie warto ich zapamiętywać. Bezpieczną zasadą jest nigdy nie używać_
w kodzie nazw zaczynających się od . Odpowiedni wpis FAQ C: c-faq.com/~scs/cgi-bin/faqcat.cgi?sec=decl#namespaceGlobal variables: just don't use global variables. They are evil.
- chyba że pracujesz nad wbudowanym projektem i masz 1024 bajty pamięci RAM i procesor 8 MHz.„Wskaźniki struktury” nie są bytami, które wymagają klauzuli konwencji nazewnictwa, aby je objąć. Po prostu
struct WhatEver *
. NIE ukrywaj faktu, że istnieje wskaźnik związany ze sprytną i „oczywistą” czcionką. Nie służy to celowi, jest już do pisania i niszczy równowagę między deklaracją a dostępem.źródło
Po pierwsze, C nie ma funkcji publicznych / prywatnych / wirtualnych. To jest C ++ i ma różne konwencje. W C zazwyczaj masz:
C ++ jest bardziej złożony. Widziałem tutaj prawdziwą mieszankę. Wielbłądowe litery dla nazw klas lub małe litery + podkreślenia (z mojego doświadczenia wynika, że wielbłądzie są bardziej powszechne). Struktury są używane rzadko (i zazwyczaj dlatego, że wymaga ich biblioteka, w przeciwnym razie używałbyś klas).
źródło
external linkage
na myśli „funkcje publiczne” iinternal linkage
„funkcje prywatne”.ALL_CAPS
jest często używany także dla wartości wyliczeniowych.Wiesz, lubię to, aby było to proste, ale jasne ... Więc oto, czego używam, w C:
i,n,c
itd. (Tylko jedna litera. Jeśli jedna litera nie jest jasna, zmień ją jako zmienną lokalną)lowerCamelCase
g_lowerCamelCase
ALL_CAPS
p_
do przedrostka. Dla zmiennych globalnych byłoby togp_var
dla zmiennych lokalnychp_var
, dla zmiennych stałychp_VAR
. Jeśli używane są dalekie wskaźniki, użyjfp_
zamiastp_
.ModuleCamelCase
(Moduł = pełna nazwa modułu lub 2-3-literowy skrót, ale nadal w formacieCamelCase
.)lowerCamelCase
ModuleCamelCase
ALL_CAPS
ModuleCamelCase
CamelCase
CamelCase
Wpisałem moje structs, ale używam tej samej nazwy zarówno dla tagu, jak i dla typedef. Tag nie jest przeznaczony do powszechnego użytku. Zamiast tego lepiej jest użyć typedef. Przekazuję również deklarację typedef w nagłówku modułu publicznego do hermetyzacji, aby móc użyć nazwy typedef'd w definicji.
Pełny
struct
przykład :źródło
Programując jednocześnie w językach C #, java, C, C ++ i obiektywnym C przyjąłem bardzo prostą i przejrzystą konwencję nazewnictwa, aby uprościć sobie życie.
Przede wszystkim opiera się na sile nowoczesnych IDE (takich jak eclipse, Xcode ...), z możliwością uzyskania szybkich informacji przez najechanie kursorem lub kliknięcie ctrl ... Akceptując to, zrezygnowałem z użycia dowolnego prefiksu, sufiksu i inne znaczniki, które są po prostu podawane przez IDE.
Następnie konwencja:
parametry, elementy struktury i unii
I to wszystko.
To daje
źródło
Odradzałbym mieszanie obudowy wielbłąda i separacji podkreślenia (tak jak zaproponowałeś dla członków struktury). To jest mylące. Można by pomyśleć, hej mam,
get_length
więc prawdopodobnie powinienem to zrobić,make_subset
a potem dowiadujesz się, że tak jestmakeSubset
. Kieruj się zasadą najmniejszego zdziwienia i bądź konsekwentny.Uważam, że CamelCase jest przydatne do wpisywania nazw, takich jak struktury, typedef i wyliczenia. Ale to wszystko. Dla całej reszty (nazwy funkcji, nazwy składowe struktury itp.) Używam underscore_separation.
źródło
Oto (najwyraźniej) nietypowy, który okazał się przydatny: nazwa modułu w CamelCase, następnie podkreślenie, a następnie nazwa funkcji lub zakresu pliku w CamelCase. Na przykład:
źródło
Jedno mnie zdezorientowało: planujesz stworzyć nową konwencję nazewnictwa dla nowego projektu. Ogólnie powinieneś mieć konwencję nazewnictwa obejmującą całą firmę lub zespół. Jeśli masz już projekty, które mają jakąkolwiek formę konwencji nazewnictwa, nie powinieneś zmieniać konwencji dla nowego projektu. Jeśli powyższa konwencja jest tylko kodyfikacją twoich istniejących praktyk, to jesteś złoty. Im bardziej różni się on od istniejących de facto standardów, tym trudniej będzie nabrać ducha myślenia w nowym standardzie.
Jedyną sugestią, jaką chciałbym dodać, jest to, że polubiłem _t na końcu typów w stylu uint32_t i size_t. Jest to dla mnie bardzo C-ish, chociaż niektórzy mogą narzekać, że to po prostu „odwrócony” węgierski.
źródło
Powinieneś także pomyśleć o kolejności słów, aby ułatwić automatyczne uzupełnianie nazw .
Dobra praktyka: nazwa biblioteki + nazwa modułu + akcja + temat
Jeśli część nie jest istotna, pomiń ją, ale przynajmniej nazwa modułu i akcja powinna być zawsze przedstawiana.
Przykłady:
os_task_set_prio
,list_get_size
,avg_get
OS_TASK_PRIO_MAX
źródło
Może być wiele, głównie IDE, które dyktują pewne trendy, a konwencje C ++ również są forsowane. Dla C zwykle:
Notacja węgierska dla globals jest dobra, ale nie dla typów. Nawet w przypadku trywialnych nazw użyj co najmniej dwóch znaków.
źródło
Myślę, że te mogą pomóc początkującym: Konwencja nazewnictwa zmiennych w c
źródło