Quelles sont les conventions de nommage couramment utilisées en C? Je sais qu'il y en a au moins deux:
Je parle de C seulement ici. La plupart de nos projets sont de petits systèmes intégrés dans lesquels nous utilisons C.
Voici celui que je prévois utiliser pour mon prochain projet:
C Convention de nommage
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)
La chose la plus importante ici est la cohérence. Cela dit, je suis la convention de codage GTK +, qui peut être résumée comme suit:
MAX_BUFFER_SIZE
, TRACKING_ID_PREFIX
.GtkWidget
, TrackingOrder
.gtk_widget_show()
, tracking_order_process()
.GtkWidget *foo
, TrackingOrder *bar
._refrobnicate_data_tables()
, _destroy_cache()
.Les "pointeurs de structure" ne sont pas des entités nécessitant une clause de convention de dénomination pour les couvrir. Ils sont juste struct WhatEver *
. NE PAS cacher le fait qu’un pointeur est impliqué dans un typedef intelligent et "évident". Il ne sert à rien, est plus long à taper et détruit l'équilibre entre déclaration et accès.
Premièrement, C n’a pas de fonctions publiques/privées/virtuelles. C'est C++ et il a des conventions différentes. En C, vous avez généralement:
C++ est plus complexe. J'ai vu un vrai mélange ici. Affaire Camel pour les noms de classe ou caractères de soulignement minuscules + (l’affaire Camel est plus courante dans mon expérience). Les structures sont rarement utilisées (et généralement parce qu'une bibliothèque en a besoin, sinon vous utiliseriez des classes).
Je recommande de ne pas mélanger les cas de chameaux et les séparations de soulignement (comme vous l'avez proposé pour les membres de la structure). Ceci est déroutant. Vous penseriez, hé j'ai get_length
donc je devrais probablement avoir make_subset
et ensuite vous découvrirez que c'est en fait makeSubset
. Utilisez le principe du moindre étonnement et soyez cohérent.
Je trouve CamelCase utile pour taper des noms, tels que structs, typedefs et enums. C'est à peu près tout, cependant. Pour tout le reste (noms de fonctions, noms de membres de struct, etc.), j'utilise underscore_separation.
Codage en C #, Java, C, C++ et Objective C en même temps, j’ai adopté une convention de nommage très simple et claire pour me simplifier la vie.
Tout d’abord, il s’appuie sur la puissance des IDE modernes (tels que Eclipse, Xcode, etc.), avec la possibilité d’obtenir des informations rapidement en survolant ou en appuyant sur Ctrl .... préfixe, suffixe et autres marqueurs simplement donnés par l'EDI.
Ensuite, la convention:
Et c'est tout.
Il donne
class MyClass {
enum TheEnumeration {
FIRST_ELEMENT,
SECOND_ELEMENT,
}
int class_variable;
int MyMethod(int first_param, int second_parameter) {
int local_variable;
TheEnumeration local_enum;
for(int myindex=0, myindex<class_variable, myindex++) {
localEnum = FIRST_ELEMENT;
}
}
}
Voici un exemple (apparemment) peu commun que j'ai trouvé utile: nom du module dans CamelCase, puis un trait de soulignement, puis nom de la fonction ou de la portée du fichier dans CamelCase. Donc par exemple:
Bluetooth_Init()
CommsHub_Update()
Serial_TxBuffer[]
Vous savez, j'aime rester simple, mais clair ... Alors voici ce que j'utilise, en C:
i,n,c
, etc ... (une seule lettre. Si une lettre n’est pas Effacer, faites-en une variable locale)lowerCamelCase
g_lowerCamelCase
ALL_CAPS
p_
au préfixe. Pour les variables globales, il s'agirait de gp_var
, pour les variables locales p_var
, pour les variables const p_VAR
. Si des pointeurs éloignés sont utilisés, utilisez un fp_
au lieu de p_
.ModuleCamelCase
(Module = nom complet du module ou abréviation de 2 à 3 lettres, mais toujours en CamelCase
.)lowerCamelCase
ModuleCamelCase
ALL_CAPS
ModuleCamelCase
CamelCase
CamelCase
Je typedef mes structs, mais utilise le même nom pour À la fois la balise et le typedef. La balise n'est pas destinée à être utilisée couramment. Au lieu de cela, il est préférable d’utiliser le typedef. Je fais aussi suivre la déclaration de typedef dans l'en-tête du module public pour l'encapsulation et pour pouvoir utiliser le nom de typedef dans la définition.
Full struct
Exemple :
typdef struct TheName TheName;
struct TheName{
int var;
TheName *p_link;
};
Une chose me laisse perplexe: vous envisagez de créer une nouvelle convention de nommage pour un nouveau projet. Généralement, vous devez avoir une convention de dénomination qui s'applique à toute l'entreprise ou à toute l'équipe. Si vous avez déjà des projets qui ont une forme ou une autre de convention de nommage, vous ne devez pas changer la convention pour un nouveau projet. Si la convention ci-dessus n'est que la codification de vos pratiques existantes, vous êtes en or. Plus elle diffère des normes de facto existantes, plus il sera difficile de faire accepter la nouvelle norme.
La seule suggestion que je voudrais ajouter est que j'ai pris goût à _t à la fin des types dans le style uint32_t et size_t. C'est très C-ish pour moi bien que certains puissent se plaindre que c'est juste "inverser" le hongrois.
Il pourrait y en avoir beaucoup, surtout les IDE dictent certaines tendances et les conventions C++ poussent également. Pour C couramment:
La notation hongroise pour les globales convient, mais pas pour les types . Et même pour les noms triviaux, utilisez au moins deux caractères.
Vous devez également penser à la ordre des mots pour faciliter la complétion automatique du nom.
Une bonne pratique: nom de la bibliothèque + nom du module + action + sujet
Si une partie n'est pas pertinente, sautez-la, mais au moins un nom de module et une action doivent toujours être présentés.
Exemples:
os_task_set_prio
, list_get_size
, avg_get
OS_TASK_PRIO_MAX