web-dev-qa-db-fra.com

Quelles sont les conventions de dénomination les plus courantes en C?

Quelles sont les conventions de nommage couramment utilisées en C? Je sais qu'il y en a au moins deux:

  1. GNU/linux/K & R avec lower_case_functions
  2. ? prénom ? avec les fonctions UpperCaseFoo

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)
97
JeffV

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:

  1. Toutes les macros et constantes en majuscules: MAX_BUFFER_SIZE, TRACKING_ID_PREFIX.
  2. Noms de structures et typedef dans camelcase: GtkWidget, TrackingOrder.
  3. Fonctions qui fonctionnent sur les structures: style C classique: gtk_widget_show(), tracking_order_process().
  4. Pointeurs: rien d'extraordinaire ici: GtkWidget *foo, TrackingOrder *bar.
  5. Variables globales: n'utilisez pas de variables globales. Ils sont diaboliques.
  6. Les fonctions présentes, mais Ne devraient pas être appelées directement, ou avoir Des utilisations obscures, ou peu importe: un ou plusieurs Soulignés au début: _refrobnicate_data_tables(), _destroy_cache().
103
axel_c

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.

27
unwind

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:

  • Constantes dans ALL_CAPS
  • Les tirets bas pour délimiter les mots dans les structures ou les noms de fonctions, vous ne voyez presque jamais de cas de chameau en C;
  • structs, typedefs, unions, membres (des unions et structs) et les valeurs enum sont typiquement en minuscules (selon mon expérience) plutôt que la convention C++/Java/C #/etc de faire de la première lettre un capital mais je suppose que c'est possible dans C aussi.

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).

13
cletus

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.

8
Eli Bendersky

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:

  • Tous les noms DOIVENT être une phrase lisible expliquant ce que vous avez. Comme "c'est ma convention".
  • Ensuite, 4 méthodes pour obtenir une convention d'une phrase:
    1. THIS_IS_MY_CONVENTION pour les macros, membres d'énumération
    2. ThisIsMyConvention pour nom de fichier, nom d'objet (classe, structure, enum, union ...), nom de fonction, nom de méthode, typedef
    3. this_is_my_convention variables globales et locales,
      paramètres, éléments struct et union
    4. thisismyconvention [facultatif] variables très locales et temporaires (comme un index de boucle for ())

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;
        }
    }
}
8
Luc Fourestier

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[]
5
Steve Melnikoff

Vous savez, j'aime rester simple, mais clair ... Alors voici ce que j'utilise, en C:

  • Variables triviales : i,n,c, etc ... (une seule lettre. Si une lettre n’est pas Effacer, faites-en une variable locale)
  • Variables locales : lowerCamelCase
  • Variables globales : g_lowerCamelCase
  • Variables Const : ALL_CAPS
  • Variables de pointeur : ajoute un 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_.
  • Structs : ModuleCamelCase (Module = nom complet du module ou abréviation de 2 à 3 lettres, mais toujours en CamelCase.)
  • Variables Struct Member : lowerCamelCase
  • Enums : ModuleCamelCase
  • Valeurs énumérées : ALL_CAPS
  • Fonctions publiques : ModuleCamelCase
  • Fonctions privées : CamelCase
  • Macros : 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;
};
5
SeanRamey

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.

3
jmucchiello

Il pourrait y en avoir beaucoup, surtout les IDE dictent certaines tendances et les conventions C++ poussent également. Pour C couramment:

  • UNDERSCORED_UPPER_CASE (définitions de macros, constantes, membres enum)
  • underscored_lower_case (variables, fonctions)
  • CamelCase (types personnalisés: structs, enums, unions)
  • uncappedCamelCase (style Java oppa)
  • UnderScored_CamelCase (variables, fonctions sous type d'espaces de noms)

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.

0
renonsz

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:

  • nom de la fonction: os_task_set_prio, list_get_size, avg_get 
  • define (ici généralement pas de partie action): OS_TASK_PRIO_MAX
0