Quels sont les plus communs des conventions de nommage en C?
Quelles sont les conventions de nommage utilisés pour le C? Je sais qu'il y a au moins deux:
- GNU /linux /K&R avec lower_case_functions
- ? nom ? avec UpperCaseFoo fonctions
Je parle C seulement ici. La plupart de nos projets sont de petits systèmes embarqués dans lequel nous utilisons C.
Ici est celui que je suis l'intention de l'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)
- Je n'aurais pas la force d'un 'g_' préfixe des variables globales; je voudrais appliquer des noms significatifs (donc client_locale et pas cl_lc comme un nom de variable globale). Classique C ne pas utiliser de chameau cas; j'ai écrit le code en chameau dans C, et il semble bizarre (si je ne le fais pas comme ça plus). Cela dit, il n'est pas faux - et la consistance est plus important que la convention est utilisé. Éviter les typedefs qui intègrent la structure de pointeurs; tenir compte de la norme C - FICHIER ' * ' est orthographié ainsi, pas FILE_PTR.
- Leffler, quoi de mal avec g_ pour signifier globals? Dans les systèmes embarqués, j'ai eu de la difficulté à avant où c'était dur pour traquer les inter-dépendances des modules à travers les variables globales et extern g_somevar. Personnellement, je pense que c'est généralement une mauvaise idée, mais ce genre de chose se fait pour des raisons de performances. Par exemple, un indicateur global qui est définie par une interruption indiquant que les données sont prêtes.
- Pour ce que ça vaut, cette convention de nommage a surtout été arraché à partir de PalmOS, l'API conventions. Aussi, il est similaire à la convention utilisée dans O'Reilly livre: "la Programmation de Systèmes Embarqués avec des C et des Outils de Développement GNU". Personnellement, j'aime le TitleCase dans les noms de fonction. J'envisageais d'aller avec lowerCamelCase dans une liaison interne des fonctions (que j'ai appelé le privé dans ma question).
- V - Le sarcastique réponse est "garder la trace des variables globales en notant qu'ils n'ont pas été définies comme des variables locales dans le corps de la fonction," mais je pense qu'il y a un certain mérite dans cette réponse. Si vous avez de nombreuses variables locales que vous ne pouvez pas dire que les variables sont locales et qui sont globales, votre fonction est probablement trop gros, et à moins que vous ayez une bonne raison de ne pas (espace/mémoire/de l'efficacité), vous devez briser.
- Lutz, je suis d'accord, de tout mon cœur. Dans la mesure du possible vars doit être gardée à l'étendue la plus étroite. Notez qu'il existe en fait trois portées nous sommes à discuter: local à une fonction locale à un module (pas de externs de liaison de la variable) et les variables globales avec une liaison externe. Il est fréquent d'avoir le "global à un module de" variables dans les systèmes embarqués. Par conséquent, des précautions doivent être prises pour identifier les variables globales avec une liaison externe de sorte qu'ils peuvent être maintenus à un minimum et le module interactions compris. C'est là que le "g_" préfixe est utile.
- Je suis d'accord avec l'utilisation de certains des g_ notation. Il est utile de savoir si quelque chose est visé est global ou quelque part d'autre.
- J'aime préfixe variables globales //.
- J'ai à peu près perdu quand j'ai lu votre commentaire, lol. Comme un vimmer préfèrent préfixe globals avec "ggVGd", car en général ils sont accompagnés par d'autres problèmes de conception.
Vous devez vous connecter pour publier un commentaire.
La chose la plus importante ici est la cohérence. Cela dit, j'ai suivi l'GTK+ convention de codage, qui peuvent être résumées comme suit:
MAX_BUFFER_SIZE
,TRACKING_ID_PREFIX
.GtkWidget
,TrackingOrder
.gtk_widget_show()
,tracking_order_process()
.GtkWidget *foo
,TrackingOrder *bar
.ne devrait pas être appelé directement, ou ont
obscur utilise, ou quoi que ce soit: l'un ou plusieurs
des traits de soulignement au début:
_refrobnicate_data_tables()
,_destroy_cache()
.static
et passez le module préfixe, donc sigtk_widget_show()
est une fonction de la portée du fichier, il deviendrait tout simplementwidget_show()
statiques de la classe de stockage ajouté._
pour la mise en œuvre et d'utiliser à l'avenir. Il existe quelques exceptions pour les noms commençant par_
mais à mon avis il ne vaut pas la peine de les mémoriser. Un coffre-fort à la règle est de ne jamais utiliser les noms commençant par_
dans votre code. Pertinentes C entrée de la FAQ: c-faq.com/~scs/cgi-bin/faqcat.cgi?sec=decl#namespaceGlobal variables: just don't use global variables. They are evil.
- sauf si vous travaillez sur le projet intégré et vous avez 1024 octets de RAM et 8MHz CPU."Struct pointeurs" ne sont pas des entités qui ont besoin d'une convention de nommage de la clause pour les couvrir. Ils sont juste
struct WhatEver *
. NE PAS cacher le fait qu'il y est un pointeur impliqué avec un astucieux et "évident" typedef. Il ne sert à rien, c'est plus long à taper, et détruit l'équilibre entre la déclaration et l'accès.struc WhatEver *
dans la mise en œuvre de fichier puis.Ref
, par exempleCFStringRef
,CFArrayRef
etc.Eh bien tout d'abord C n'a pas de public/privé/fonctions virtuelles. C'est le C++, et il a différentes conventions. En C en général, vous avez:
C++ est plus complexe. J'ai vu un vrai mix ici. Chameau cas pour les noms de classe ou en minuscules+traits de soulignement (chameau cas est le plus courant dans mon expérience). Les structures sont rarement utilisées (et en général parce qu'une bibliothèque a besoin d'eux, sinon vous pouvez utiliser les classes).
external linkage
pour les "fonctions publiques" etinternal linkage
pour "les fonctions privées".ALL_CAPS
est souvent utilisé pour les valeurs de l'enum, trop.De codage dans C#, java, C, C++ et objective-C en même temps, j'ai été très clair et simple convention de nommage pour simplifier ma vie.
Tout d'abord, il s'appuie sur la puissance de l'Ide modernes (tels que eclipse, Xcode...), avec la possibilité d'obtenir rapidement de l'information en passant la souris ou ctrl clic...
En acceptant que, j'ai supprimé l'utilisation de n'importe quel préfixe, suffixe et d'autres marqueurs qui sont simplement données par les IDE.
Ensuite, la convention:
paramètres, struct et union éléments
Et c'est tout.
Il donne
Je déconseille de mélanger chameau cas et le trait de soulignement de séparation (comme vous l'a proposé pour les membres de la structure). Ceci est source de confusion. Vous pourriez penser, hé, j'ai
get_length
donc je devrais avoirmake_subset
et puis vous trouvez qu'il est en faitmakeSubset
. Utiliser le principe du moindre étonnement, et être cohérent.Je trouve CamelCase utile pour les noms de type, comme les structures, typedefs et les énumérations. C'est à peu près tout, si. Pour tout le reste (les noms de fonction, structure noms des membres, etc.) J'utilise underscore_separation.
Vous le savez, j'aime garder les choses simples, mais clair... Donc voilà ce que j'utilise, dans C:
i,n,c
,etc... (une Seule lettre. Si une lettre n'est pasclair, puis en faire une Variable Locale)
lowerCamelCase
g_lowerCamelCase
ALL_CAPS
p_
pour le préfixe. Pour les variables globales, il seraitgp_var
, pour les variables localesp_var
, pour const variablesp_VAR
. Si les pointeurs sont utilisés, puis d'utiliser unfp_
au lieu dep_
.ModuleCamelCase
(Module = le nom complet du module, ou un 2-3 lettre de l'abréviation, mais encore dansCamelCase
.)lowerCamelCase
ModuleCamelCase
ALL_CAPS
ModuleCamelCase
CamelCase
CamelCase
Je typedef mon structs, mais utiliser le même nom pour
à la fois l'étiquette et de la définition de type. La balise n'est pas destiné à être utilisé couramment.
Au lieu de cela, il est préférable d'utiliser la définition de type. J'ai également déclarer avant le typedef dans le public en-tête de module pour l'encapsulation et afin que je puisse utiliser le typedef avait nom dans la définition.
Plein
struct
Exemple:Voici un (apparemment) hors du commun, que j'ai trouvé utile: nom du module en CamelCase, puis un trait de soulignement, alors la fonction ou le fichier-nom de l'étendue en CamelCase. Ainsi, par exemple:
Je ne comprends pas une chose: Vous avez l'intention de créer une nouvelle convention de nommage pour un nouveau projet. En général, vous devriez avoir une convention de nommage de l'entreprise ou de l'équipe à l'échelle. Si vous avez déjà des projets qui ont toute forme de convention de nommage, vous ne devez pas modifier la convention pour un nouveau projet. Si la convention ci-dessus est juste de la codification de vos pratiques actuelles, alors vous êtes de l'or. Plus elle diffère de l'existant de facto normes de la plus il sera difficile de gagner de la notoriété acquise dans la nouvelle norme.
Sur la seule suggestion que je voudrais ajouter, c'est que j'ai pris goût à l'_t à la fin de types dans le style de uint32_t et size_t. C'est très C-ish pour moi, bien que certains pourraient se plaindre, c'est juste "reverse" hongrois.
Vous devez également penser à la ordre des mots pour faire de la automatique nom de l'achèvement plus facile.
Une bonne pratique: nom de la bibliothèque + nom du module + action + sujet
Si une partie n'est pas pertinent de l'ignorer, mais au moins un nom de module et une action doit toujours être présenté.
Exemples:
os_task_set_prio
,list_get_size
,avg_get
OS_TASK_PRIO_MAX
Il pourrait y avoir beaucoup de gens, principalement IDEs dicter certaines tendances et C++ conventions sont également de pousser. Pour C souvent:
Notation hongroise pour les variables globales sont bien, mais pas pour les types.
Et de même pour les noms triviaux, veuillez utiliser au moins deux caractères.