Welcher Stil für die Benennung von Typen in C verwendet werden soll

8

Nach dies Stack Overflow Antwort , das "_t" Postfix für Typnamen ist in C reserviert. Wenn ich typedef benutze, um einen neuen Opaque Type zu erstellen, bin ich es gewohnt, eine Art Hinweis darauf zu haben, dass dies ein a ist Art. Normalerweise würde ich mit etwas wie hashmap_t gehen, aber jetzt brauche ich etwas anderes.

Gibt es ein Standardbenennungsschema für Typen in C? In anderen Sprachen ist die Verwendung von CapsCase wie Hashmap üblich, aber eine Menge C-Code, den ich sehe, verwendet überhaupt keinen Großbuchstaben. CapsCase funktioniert auch ziemlich gut mit einem Bibliotheks-Präfix wie XYHashmap .

Gibt es also eine allgemeine Regel oder einen Standard für die Benennung von Typen in C?

    
Mike Weller 02.01.2010, 06:39
quelle

6 Antworten

6

Ja, POSIX reserviert Namen, die auf _t enden, wenn Sie einen der POSIX-Header hinzufügen, also sollten Sie sich von denen fernhalten - theoretisch. Ich arbeite an einem Projekt, das in den letzten zwanzig Jahren zwei oder drei Mal mit solchen Namen in Konflikt geraten ist. Sie können das Risiko einer Kollision minimieren, indem Sie ein Unternehmenspräfix (z. B. die TLA Ihres Unternehmens und einen Unterstrich) oder gemischte Groß- / Kleinschreibung verwenden (sowie das Suffix _t ). Alle Kollisionen, die ich gesehen habe, waren kurz und nur in Kleinbuchstaben ( dec_t , loc_t , ...).

Außer dem vom System bereitgestellten (und vom System reservierten) _t -Suffix gibt es keine spezifische, weit verbreitete Konvention. Eines der gemischten Systeme (camelCase oder InitialCaps) funktioniert gut. Ein systematisches Präfix funktioniert auch gut - die besseren Bibliotheken tendieren dazu vorsichtig zu sein.

Wenn Sie sich für die Verwendung von Kleinbuchstaben und _t Suffix entscheiden, stellen Sie sicher, dass Sie ausreichend lange Namen verwenden und sorgfältig den POSIX-Standard, die primären Plattformen, an denen Sie arbeiten, und alle, an denen Sie arbeiten, überprüfen um unnötige Konflikte zu vermeiden. Die schlimmsten Probleme treten auf, wenn Sie einen Namen example_t an Kunden freigeben und dann feststellen, dass auf einer neuen Plattform ein Konflikt auftritt. Dann müssen Sie darüber nachdenken, Kunden dazu zu bringen, ihren Code zu ändern, was sie immer widerwillig tun. Es ist besser, das Problem im Voraus zu vermeiden.

    
Jonathan Leffler 02.01.2010, 06:50
quelle
5

Die Richtlinien für den indischen Hill-Stil haben einige Vorschläge:

  

Zweifelsohne haben einzelne Projekte   ihre eigenen Namenskonventionen. Dort   sind jedoch einige allgemeine Regeln.

     
  • Namen mit führenden und abschließenden Unterstrichen sind für das System reserviert   Zwecke und sollte nicht verwendet werden für   alle benutzerdefinierten Namen. Die meisten Systeme   Verwenden Sie sie für Namen, die der Benutzer   sollte nicht wissen müssen. Wenn du musst   habe deine eigenen privaten Identifikatoren,   Beginne sie mit einem oder zwei Buchstaben   Identifizieren des Pakets, zu dem sie gehören   gehören.

  •   
  • #define Konstanten sollten in allen CAPS sein.

  •   
  • Enum-Konstanten sind aktiviert oder in allen CAPS

  •   
  • Funktion, typedef und Variablennamen sowie struct, union und   Enum-Tag-Namen sollten niedriger sein   Fall.

  •   
  • Viele Makro "Funktionen" sind in allen CAPS. Einige Makros (wie getchar und   putchar) sind in Kleinbuchstaben, da sie   kann auch als Funktionen existieren.   Kleingeschriebene Makronamen sind nur   akzeptabel, wenn sich die Makros wie a verhalten   Funktionsaufruf, dh sie werten aus   ihre Parameter genau einmal und tun   Weisen Sie benannten Parametern keine Werte zu.   Manchmal ist es unmöglich, ein zu schreiben   Makro, das sich wie eine Funktion verhält   obwohl die Argumente sind   einmal genau ausgewertet.

  •   
  • Vermeiden Sie Namen, die sich nur im Fall unterscheiden, wie foo und Foo. Ähnlich,   vermeide foobar und foo_bar. Das   Möglichkeit zur Verwirrung ist   beträchtlich.

  •   
  • Vermeiden Sie auf ähnliche Weise Namen, die ähnlich aussehen. Auf vielen Terminals und   Drucker, 'l', '1' und 'I' sehen ziemlich aus   ähnlich. Eine Variable namens 'l' ist   besonders schlecht, weil es so aussieht   ähnlich wie die Konstante '1'.

  •   

Im Allgemeinen werden globale Namen (einschließlich   enums) sollte ein gemeinsames Präfix haben   Identifizieren des Moduls, das sie   gehören mit. Globals können alternativ   in einer globalen Struktur gruppiert sein.   Typedeffed Namen haben oft "_t"   an ihren Namen angehängt.

     

Vermeiden Sie Namen, mit denen Konflikte auftreten könnten   verschiedene Standardbibliotheksnamen. Etwas   Systeme enthalten mehr Bibliothekscode   als du willst. Auch Ihr Programm darf   eines Tages verlängert werden.

    
Andrew Hare 02.01.2010 06:41
quelle
3

C reserviert nur einige Verwendungen eines _t Suffixes. Soweit ich das beurteilen kann, sind dies nur aktuelle Bezeichner, die mit _t und einem Bezeichner enden, der int oder uint (7.26.8) startet. POSIX reserviert jedoch möglicherweise mehr.

Es ist ein allgemeines Problem in C, da Sie extrem flache Namespaces haben, und es gibt keine Wunderwaffe. Wenn Sie mit CapCase-Namen vertraut sind und diese für Sie gut funktionieren, sollten Sie sie weiterhin verwenden. Andernfalls müssen Sie die Ziele des aktuellen Projekts bewerten und herausfinden, welche Lösung am besten zutrifft sie.

    
Roger Pate 02.01.2010 06:52
quelle
2
___ qstnhdr ___ Welcher Stil für die Benennung von Typen in C verwendet werden soll ___ answer1990819 ___

Ja, POSIX reserviert Namen, die auf GtkButton enden, wenn Sie einen der POSIX-Header hinzufügen, also sollten Sie sich von denen fernhalten - theoretisch. Ich arbeite an einem Projekt, das in den letzten zwanzig Jahren zwei oder drei Mal mit solchen Namen in Konflikt geraten ist. Sie können das Risiko einer Kollision minimieren, indem Sie ein Unternehmenspräfix (z. B. die TLA Ihres Unternehmens und einen Unterstrich) oder gemischte Groß- / Kleinschreibung verwenden (sowie das Suffix ClutterStageWindow ). Alle Kollisionen, die ich gesehen habe, waren kurz und nur in Kleinbuchstaben ( clutter_actor_get_geometry() , %code% , ...).

Außer dem vom System bereitgestellten (und vom System reservierten) %code% -Suffix gibt es keine spezifische, weit verbreitete Konvention. Eines der gemischten Systeme (camelCase oder InitialCaps) funktioniert gut. Ein systematisches Präfix funktioniert auch gut - die besseren Bibliotheken tendieren dazu vorsichtig zu sein.

Wenn Sie sich für die Verwendung von Kleinbuchstaben und %code% Suffix entscheiden, stellen Sie sicher, dass Sie ausreichend lange Namen verwenden und sorgfältig den POSIX-Standard, die primären Plattformen, an denen Sie arbeiten, und alle, an denen Sie arbeiten, überprüfen um unnötige Konflikte zu vermeiden. Die schlimmsten Probleme treten auf, wenn Sie einen Namen %code% an Kunden freigeben und dann feststellen, dass auf einer neuen Plattform ein Konflikt auftritt. Dann müssen Sie darüber nachdenken, Kunden dazu zu bringen, ihren Code zu ändern, was sie immer widerwillig tun. Es ist besser, das Problem im Voraus zu vermeiden.

    
___ answer1990804 ___

Die Richtlinien für den indischen Hill-Stil haben einige Vorschläge:

  

Zweifelsohne haben einzelne Projekte   ihre eigenen Namenskonventionen. Dort   sind jedoch einige allgemeine Regeln.

     
  • Namen mit führenden und abschließenden Unterstrichen sind für das System reserviert   Zwecke und sollte nicht verwendet werden für   alle benutzerdefinierten Namen. Die meisten Systeme   Verwenden Sie sie für Namen, die der Benutzer   sollte nicht wissen müssen. Wenn du musst   habe deine eigenen privaten Identifikatoren,   Beginne sie mit einem oder zwei Buchstaben   Identifizieren des Pakets, zu dem sie gehören   gehören.

  •   
  • %code% Konstanten sollten in allen CAPS sein.

  •   
  • Enum-Konstanten sind aktiviert oder in allen CAPS

  •   
  • Funktion, typedef und Variablennamen sowie struct, union und   Enum-Tag-Namen sollten niedriger sein   Fall.

  •   
  • Viele Makro "Funktionen" sind in allen CAPS. Einige Makros (wie getchar und   putchar) sind in Kleinbuchstaben, da sie   kann auch als Funktionen existieren.   Kleingeschriebene Makronamen sind nur   akzeptabel, wenn sich die Makros wie a verhalten   Funktionsaufruf, dh sie werten aus   ihre Parameter genau einmal und tun   Weisen Sie benannten Parametern keine Werte zu.   Manchmal ist es unmöglich, ein zu schreiben   Makro, das sich wie eine Funktion verhält   obwohl die Argumente sind   einmal genau ausgewertet.

  •   
  • Vermeiden Sie Namen, die sich nur im Fall unterscheiden, wie foo und Foo. Ähnlich,   vermeide foobar und foo_bar. Das   Möglichkeit zur Verwirrung ist   beträchtlich.

  •   
  • Vermeiden Sie auf ähnliche Weise Namen, die ähnlich aussehen. Auf vielen Terminals und   Drucker, 'l', '1' und 'I' sehen ziemlich aus   ähnlich. Eine Variable namens 'l' ist   besonders schlecht, weil es so aussieht   ähnlich wie die Konstante '1'.

  •   

Im Allgemeinen werden globale Namen (einschließlich   enums) sollte ein gemeinsames Präfix haben   Identifizieren des Moduls, das sie   gehören mit. Globals können alternativ   in einer globalen Struktur gruppiert sein.   Typedeffed Namen haben oft "_t"   an ihren Namen angehängt.

     

Vermeiden Sie Namen, mit denen Konflikte auftreten könnten   verschiedene Standardbibliotheksnamen. Etwas   Systeme enthalten mehr Bibliothekscode   als du willst. Auch Ihr Programm darf   eines Tages verlängert werden.

    
___ qstntxt ___

Nach dies Stack Overflow Antwort , das "_t" Postfix für Typnamen ist in C reserviert. Wenn ich %code% benutze, um einen neuen Opaque Type zu erstellen, bin ich es gewohnt, eine Art Hinweis darauf zu haben, dass dies ein a ist Art. Normalerweise würde ich mit etwas wie %code% gehen, aber jetzt brauche ich etwas anderes.

Gibt es ein Standardbenennungsschema für Typen in C? In anderen Sprachen ist die Verwendung von CapsCase wie %code% üblich, aber eine Menge C-Code, den ich sehe, verwendet überhaupt keinen Großbuchstaben. CapsCase funktioniert auch ziemlich gut mit einem Bibliotheks-Präfix wie %code% .

Gibt es also eine allgemeine Regel oder einen Standard für die Benennung von Typen in C?

    
___ answer19900964 ___

CapsCase wird oft für Typen in C verwendet.

Wenn Sie sich beispielsweise Projekte im GNOME-Ökosystem ansehen (GTK +, GDK, GLib, GObject, Clutter usw.), sehen Sie Typen wie %code% oder %code% . Sie nur verwenden CapsCase für Datentypen; Funktionsnamen und Variablen sind alle Kleinbuchstaben mit Unterstrichtrennzeichen - z. %code% .

Typennamensschemata sind wie Einrückungskonventionen - sie erzeugen religiöse Kriege mit Menschen, die für ihren bevorzugten Ansatz eine Art moralische Überlegenheit behaupten. Es ist sicherlich besser, dem Stil im vorhandenen Code oder in verwandten Projekten zu folgen (z. B. für mich, GNOME in den letzten Jahren).

Wenn Sie jedoch bei Null beginnen und keine Vorlage haben, gibt es keine feste Regel. Wenn Sie daran interessiert sind, effizient zu programmieren und die Arbeit zu einer vernünftigen Zeit zu verlassen, so dass Sie nach Hause gehen und ein Bier oder was auch immer trinken können, sollten Sie sich einen Stil aussuchen und bei Ihrem Projekt bleiben, aber es spielt keine Rolle, welchen Stil Sie wählen .

    
___ tag123namingconventions ___ Namenskonventionen beziehen sich auf allgemeine Regeln für Namen, die Programmierkonstrukten wie Variablen und Methoden zugewiesen sind. Diese Konventionen erleichtern die Lesbarkeit und verbessern dadurch die Wartbarkeit von Code, indem sie die Benennungskonsistenz über verschiedene Module hinweg durchsetzen. ___ tag123c ___ C ist eine universelle Computerprogrammiersprache, die für Betriebssysteme, Bibliotheken, Spiele und andere Hochleistungsanwendungen verwendet wird. Dieses Tag sollte bei allgemeinen Fragen zur C-Sprache verwendet werden, wie in der Norm ISO 9899: 2011 definiert. Fügen Sie ggf. ein versionsspezifisches Tag wie c99 oder c90 für Fragen zu älteren Sprachstandards hinzu. C unterscheidet sich von C ++ und es sollte nicht mit dem C ++ - Tag kombiniert werden, wenn ein rationaler Grund fehlt. ___ answer4808915 ___

Eine alternative Lösung, die ziemlich gut funktioniert, ist die Verwendung von Großbuchstaben für alle Typnamen und Makronamen. Globale Variablen können CapCase (CamelBack) und alle lokalen Variablen Kleinbuchstaben sein.

Diese Technik hilft, die Lesbarkeit zu verbessern, und nutzt auch die Sprachsyntax, die die Anzahl der Verschmutzungszeichen in Variablennamen reduziert; z.B. gvar, kvar, type_t usw. Zum Beispiel können Datentypen nicht syntaktisch mit irgendeinem anderen Typ verwechselt werden.

Globale Variablen lassen sich leicht von Einheimischen unterscheiden, wenn Sie mindestens einen Großbuchstaben haben.

Ich stimme zu, dass vorangestellte oder nachgestellte Unterstriche in allen Token-Namen vermieden werden sollten.

Sehen wir uns das Beispiel unten an.

Es ist klar, dass InvertedCount aufgrund seines Falles global ist. Es ist ebenso klar, dass INT32U und RET_ERR aufgrund ihres Sytaxtyps sind. Es ist auch klar, dass INVERT_VAL () ein Makro ist, weil es auf der rechten Seite steht und es keine Umwandlung gibt, also kann es kein Datentyp sein.

Eins ist jedoch sicher. Unabhängig davon, welche Methode Sie verwenden, sollte sie mit dem Kodierungsstandard Ihrer Organisation in Einklang stehen. Für mich, die geringste Menge an Krempel, desto besser.

Natürlich ist Stil ein anderes Thema.

%Vor%     
___ answer1995064 ___

Es gibt viele Ideen und Meinungen zu diesem Thema, aber es gibt keinen universellen Standard für die Benennung von Typen. Das Wichtigste ist, konsequent zu sein. In Ermangelung von Codierungsstandards, bei der Pflege von Code, widerstehen Sie dem Drang, eine andere Namenskonvention zu verwenden. Die Einführung einer neuen Namenskonvention kann, selbst wenn sie perfekt ist, unnötige Komplexität hinzufügen.

Das ist eigentlich ein großartiges Thema, wenn man Leute interviewt. Ich bin nie auf einen guten Programmierer gestoßen, der dazu keine Meinung hatte. Keine Meinung oder keine Leidenschaft in der Antwort zeigt an, dass die Person kein erfahrener Programmierer ist.

    
___ answer1990825 ___

C reserviert nur einige Verwendungen eines %code% Suffixes. Soweit ich das beurteilen kann, sind dies nur aktuelle Bezeichner, die mit %code% und einem Bezeichner enden, der %code% oder %code% (7.26.8) startet. POSIX reserviert jedoch möglicherweise mehr.

Es ist ein allgemeines Problem in C, da Sie extrem flache Namespaces haben, und es gibt keine Wunderwaffe. Wenn Sie mit CapCase-Namen vertraut sind und diese für Sie gut funktionieren, sollten Sie sie weiterhin verwenden. Andernfalls müssen Sie die Ziele des aktuellen Projekts bewerten und herausfinden, welche Lösung am besten zutrifft sie.

    
___
Bob Murphy 02.01.2010 08:17
quelle
2

Eine alternative Lösung, die ziemlich gut funktioniert, ist die Verwendung von Großbuchstaben für alle Typnamen und Makronamen. Globale Variablen können CapCase (CamelBack) und alle lokalen Variablen Kleinbuchstaben sein.

Diese Technik hilft, die Lesbarkeit zu verbessern, und nutzt auch die Sprachsyntax, die die Anzahl der Verschmutzungszeichen in Variablennamen reduziert; z.B. gvar, kvar, type_t usw. Zum Beispiel können Datentypen nicht syntaktisch mit irgendeinem anderen Typ verwechselt werden.

Globale Variablen lassen sich leicht von Einheimischen unterscheiden, wenn Sie mindestens einen Großbuchstaben haben.

Ich stimme zu, dass vorangestellte oder nachgestellte Unterstriche in allen Token-Namen vermieden werden sollten.

Sehen wir uns das Beispiel unten an.

Es ist klar, dass InvertedCount aufgrund seines Falles global ist. Es ist ebenso klar, dass INT32U und RET_ERR aufgrund ihres Sytaxtyps sind. Es ist auch klar, dass INVERT_VAL () ein Makro ist, weil es auf der rechten Seite steht und es keine Umwandlung gibt, also kann es kein Datentyp sein.

Eins ist jedoch sicher. Unabhängig davon, welche Methode Sie verwenden, sollte sie mit dem Kodierungsstandard Ihrer Organisation in Einklang stehen. Für mich, die geringste Menge an Krempel, desto besser.

Natürlich ist Stil ein anderes Thema.

%Vor%     
ericshufro 26.01.2011 19:19
quelle
0

Es gibt viele Ideen und Meinungen zu diesem Thema, aber es gibt keinen universellen Standard für die Benennung von Typen. Das Wichtigste ist, konsequent zu sein. In Ermangelung von Codierungsstandards, bei der Pflege von Code, widerstehen Sie dem Drang, eine andere Namenskonvention zu verwenden. Die Einführung einer neuen Namenskonvention kann, selbst wenn sie perfekt ist, unnötige Komplexität hinzufügen.

Das ist eigentlich ein großartiges Thema, wenn man Leute interviewt. Ich bin nie auf einen guten Programmierer gestoßen, der dazu keine Meinung hatte. Keine Meinung oder keine Leidenschaft in der Antwort zeigt an, dass die Person kein erfahrener Programmierer ist.

    
tkyle 03.01.2010 14:05
quelle

Tags und Links