Quelles sont les conventions de dénomination couramment utilisées en C? Je sais qu'il y en a au moins deux:
- GNU / linux / K&R avec des fonctions de cas_inférieures
- ? Nom ? avec les fonctions UpperCaseFoo
Je ne parle de C qu'ici. La plupart de nos projets sont de petits systèmes embarqués dans lesquels nous utilisons C.
Voici celui que je prévois d'utiliser pour mon prochain projet:
Convention de dénomination C
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
la source
la source
Réponses:
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()
.la source
static
et ignorer le préfixe de module, donc sigtk_widget_show()
c'était une fonction avec une portée de fichier, elle deviendrait simplementwidget_show()
avec une classe de stockage statique ajoutée._
pour l'implémentation et une utilisation future. Il y a quelques exceptions aux noms commençant par_
mais à mon avis, cela ne vaut pas la peine de le mémoriser. Une règle sûre à suivre est de ne jamais utiliser de noms commençant par_
dans votre code. Entrée de la FAQ C pertinente: c-faq.com/~scs/cgi-bin/faqcat.cgi?sec=decl#namespaceGlobal variables: just don't use global variables. They are evil.
- à moins que vous ne travailliez sur un projet intégré et que vous ayez 1024 octets de RAM et 8 MHz de processeur.Les "pointeurs de structure" ne sont pas des entités qui nécessitent une clause de convention de dénomination pour les couvrir. Ils sont juste
struct WhatEver *
. NE cachez PAS 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 la déclaration et l'accès.la source
Eh bien, premièrement, C n'a pas de fonctions publiques / privées / virtuelles. C'est du C ++ et il a des conventions différentes. En C, vous avez généralement:
Le C ++ est plus complexe. J'ai vu un vrai mélange ici. Cas de chameau pour les noms de classe ou minuscules + traits de soulignement (le cas de chameau est plus courant dans mon expérience). Les structures sont rarement utilisées (et généralement parce qu'une bibliothèque les nécessite, sinon vous utiliseriez des classes).
la source
external linkage
de «fonctions publiques» etinternal linkage
de «fonctions privées».ALL_CAPS
est également souvent utilisé pour les valeurs d'énumération.Vous savez, j'aime garder les choses simples, mais claires ... Alors voici ce que j'utilise, en C:
i,n,c
(. Une seule lettre Si une lettre est pas claire, puis en faire une variable locale), etc ...lowerCamelCase
g_lowerCamelCase
ALL_CAPS
p_
au préfixe. Pour les variables globales, ce seraitgp_var
, pour les variables locales, pour les variablesp_var
constp_VAR
. Si des pointeurs éloignés sont utilisés, utilisez unfp_
au lieu dep_
.ModuleCamelCase
(Module = nom complet du module, ou une abréviation de 2-3 lettres, mais toujours enCamelCase
.)lowerCamelCase
ModuleCamelCase
ALL_CAPS
ModuleCamelCase
CamelCase
CamelCase
J'ai tapé mes structures, mais j'utilise le même nom pour la balise et le typedef. La balise n'est pas destinée à être couramment utilisée. Au lieu de cela, il est préférable d'utiliser le typedef. Je transmets également déclarer le typedef dans l'en-tête du module public pour l'encapsulation et afin que je puisse utiliser le nom typedef'd dans la définition.
struct
Exemple complet :la source
Codant en C #, java, C, C ++ et objectif C en même temps, j'ai adopté une convention de dénomination très simple et claire pour me simplifier la vie.
Tout d'abord, il s'appuie sur la puissance des IDE modernes (comme eclipse, Xcode ...), avec la possibilité d'obtenir rapidement des informations en survolant ou en cliquant sur Ctrl ... En acceptant cela, j'ai supprimé l'utilisation de tout préfixe, suffixe et d'autres marqueurs qui sont simplement donnés par l'EDI.
Ensuite, la convention:
paramètres, éléments struct et union
Et c'est tout.
Il donne
la source
Je recommanderais de ne pas mélanger le cas de chameau et la séparation de soulignement (comme vous l'avez proposé pour les membres de struct). Ceci est déroutant. Vous penseriez, hey j'ai
get_length
donc j'aurais probablement dûmake_subset
et alors vous découvrirez que c'est en faitmakeSubset
. Utilisez le principe du moindre étonnement et soyez cohérent.Je trouve CamelCase utile pour taper des noms, comme des structures, des typedefs et des énumérations. C'est à peu près tout, cependant. Pour tout le reste (noms de fonctions, noms de membres de struct, etc.) j'utilise underscore_separation.
la source
En voici un (apparemment) rare, que j'ai trouvé utile: le nom du module dans CamelCase, puis un trait de soulignement, puis le nom de la fonction ou de la portée du fichier dans CamelCase. Donc par exemple:
la source
Je suis confus par une chose: vous prévoyez de créer une nouvelle convention de dénomination pour un nouveau projet. En règle générale, vous devez avoir une convention de dénomination à l'échelle de l'entreprise ou de l'équipe. Si vous avez déjà des projets qui ont une forme de convention de dénomination, 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, alors vous êtes en or. Plus elle diffère des normes de facto existantes, plus il sera difficile de gagner la part d’esprit dans la nouvelle norme.
La seule suggestion que j'ajouterais est que j'ai pris goût à _t à la fin des types dans le style de uint32_t et size_t. C'est très C-ish pour moi même si certains pourraient se plaindre que c'est juste un hongrois "inversé".
la source
Vous devriez également penser à l' 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
la source
Il pourrait y en avoir beaucoup, principalement les IDE dictent certaines tendances et les conventions C ++ poussent également. Pour C communément:
La notation hongroise pour les globaux est correcte mais pas pour les types. Et même pour les noms triviaux, veuillez utiliser au moins deux caractères.
la source
Je pense que ceux-ci peuvent aider pour les débutants: convention de nommage des variables en c
la source