Cで最も一般的な命名規則は何ですか?


125

Cで一般的に使用される命名規則は何ですか?少なくとも2つあることを知っています。

  1. GNU / linux / lower_case_functionsを使用したK&R
  2. ?名前 ?UpperCaseFoo関数を使用

私はここでのみCについて話しています。私たちのプロジェクトのほとんどは、Cを使用する小さな組み込みシステムです。

これが私が次のプロジェクトで使用することを計画しているものです:


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)

7
グローバル変数に 'g_'プレフィックスを強制しません。意味のある名前を強制します(グローバル変数名としてcl_lcではなくclient_localeを使用します)。クラシックCはキャメルケースを使用しません。私はCでキャメルケースのコードを書いたのですが、奇妙に見えます(そのため、そのようにはしません)。とはいえ、それは間違いではありません-そして、どの規則が使用されているかよりも一貫性がより重要です。構造体ポインタをカプセル化するtypedefは避けてください。C標準を検討してください-'FILE *'はFILE_PTRではなく、このように綴られています。
ジョナサンレフラー、

2
@ジョナサン・レフラー、グローバルを表すためのg_のどこがいけないの?組み込みシステムでは、グローバル変数と外部g_somevarを使用してモジュール間の依存関係を追跡するのが難しいという問題が以前にありました。私は個人的にはそれは一般的に悪い考えだと思いますが、この種のことは通常パフォーマンス上の理由で行われます。たとえば、データの準備ができていることを示す割り込みによって設定されるグローバルフラグ。
JeffV 2009年

2
価値があるのは、この命名規則は主にPalmOS API規則から引き抜かれたものです。また、これはO'Reillyの本「CおよびGNU開発ツールによる組み込みシステムのプログラミング」で使用されている規則に似ています。個人的には、関数名のTitleCaseが好きです。私は内部リンケージ関数(質問ではプライベートと呼びました)でlowerCamelCaseを使用することを考えていました。
JeffV 2009年

3
@Chris Lutz、同意します。可能な限り変数は、最も狭い範囲で保持されます。ここで説明するスコープは実際には3つあることに注意してください。関数に対してローカル、モジュールに対してローカル(変数への外部リンクなし)、および外部リンケージを持つグローバルです。組み込みシステムでは、「モジュールに対してグローバル」変数を持つのが一般的です。したがって、グローバルを最小限に保ち、モジュールの相互作用を理解できるように、外部リンケージがあるグローバルを特定するように注意する必要があります。これは、「g_」プレフィックスが役立つ場所です。
JeffV 2009年

46
グローバル変数の前に//を付けるのが好きです。
2015年

回答:


127

ここで最も重要なことは一貫性です。そうは言っても、私はGTK +コーディング規約に従っています。

  1. 大文字のすべてのマクロと定数:MAX_BUFFER_SIZETRACKING_ID_PREFIX
  2. キャメルケースの構造体名とtypedef:GtkWidgetTrackingOrder
  3. 構造体を操作する関数:クラシックCスタイル:gtk_widget_show()tracking_order_process()
  4. ポインタ:ここでは特別なものはありません: GtkWidget *fooTrackingOrder *bar
  5. グローバル変数:グローバル変数を使用しないでください。彼らは悪です。
  6. そこにあるが、直接呼び出すべきではない関数、あいまいな使用法など、最初に1つ以上のアンダースコア: _refrobnicate_data_tables()_destroy_cache()

13
ポイント6ではstatic、モジュールプレフィックスを使用してスキップすることを好みます。そのためgtk_widget_show()、ファイルスコープを持つ関数の場合widget_show()、静的ストレージクラスが追加されただけになります。
8月のカールストロム2013

27
ポイント6に関する追加の注記:C標準には_、実装および将来の使用のために始まる名前の予約に関するいくつかのルールがあります。名前で始まるいくつかの例外があります_が、私の意見では、覚えておく価値はありません。安全なルール_は、コードで始まる名前を決して使用しないことです。関連C FAQエントリ:c-faq.com/~scs/cgi-bin/faqcat.cgi?sec
decl#

5
#2は、より具体的には、ラクダの大文字のケースまたはパスカルのケースです。キャメルケースまたはキャメルケースは、最初の文字に小文字を使用しています。
Clint Pachl 2017年

9
ローカルのマルチワード変数はどうですか?my_varまたはmyVar?
Dean Gurvitz、2018

4
Global variables: just don't use global variables. They are evil.-組み込みプロジェクトで作業していて、1024バイトのRAMと8MHzのCPUがない場合。
カミル

30

「構造ポインタ」は、それらをカバーするための命名規則句を必要とするエンティティではありません。彼らはただstruct WhatEver *です。賢くて「明白な」typedefに関連するポインタがあるという事実を隠さないでください。それは目的を果たさず、タイプするのが長くなり、宣言とアクセスのバランスを破壊します。


29
「ポインタを非表示にしない」ものの+1-この回答では残りの質問の多くは(まだ)対処していません。
ジョナサンレフラー、

1
@unwind、私は同意する傾向があります。ただし、ポインターが外部参照解除されることを意図していない場合があり、使用する構造体への実際のポインターよりもコンシューマーへのハンドルの方が多くなります。それが私がTitleCasePtrを残した理由です。typedef struct {fields} MyStruct、* MyStructPtr;
JeffV 2009年

TitleCasePtrを削除すると、実際の質問の邪魔になります。
JeffV 2009年

1
-1ポインタ型の宣言により、特に関数のシグネチャが乱雑になり、宣言とアクセスの「不均衡」が実装ファイルにのみ表示されるため、クライアントからフィールドメンバーに直接アクセスすることはできません(すべきではありません)。
8月のカールストロム2013

1
@AugustKarlstromファイン。実装ファイルの「唯一」が何なのかわかりませんが、コードもそうではありませんか?私はその質問を「外部」の名前についてのみであると解釈しませんでした。すべてのコードは、ある程度の「実装」です。
2013

17

まず、Cにはpublic / private / virtual関数がありません。それはC ++であり、さまざまな規則があります。Cでは通常、次のようになります。

  • ALL_CAPSの定数
  • 構造体または関数名で単語を区切るためにアンダースコアを使用すると、Cでキャメルケースが表示されることはほとんどありません。
  • 構造体、typedef、共用体、メンバー(共用体と構造体)、および列挙値は通常、最初の文字を大文字にするというC ++ / Java / C#/ etcの規則ではなく、小文字(私の経験では)ですが、私はそれが可能だと思いますCも。

C ++はより複雑です。ここで実際のミックスを見てきました。クラス名のキャメルケースまたは小文字+アンダースコア(私の経験ではキャメルケースがより一般的です)。構造体はめったに使用されません(通常、ライブラリがそれらを必要とするため、そうでなければクラスを使用します)。


@cletus、私はそれを理解しています。プライベートとは、モジュールヘッダーで外部に公開されておらず、モジュール外部のコードで使用されることを意図していない関数を意味します。パブリックは、外部で使用するためのモジュールAPI関数です。
JeffV 2009年

3
静的関数はプライベートと見なすことができます。質問は仮想については触れていません。しかし、+ 1は「Cのキャメルケースをめったに見ない」ことを示します。
ジョナサンレフラー、

2
ジェフはexternal linkage「パブリック関数」とinternal linkage「プライベート関数」を意味していたと思います。
pmg 2009年

1
kで始まる定数とkBufferSizeを確認しました。それがどこから来たのかわかりません。
JeffV 2009年

2
ALL_CAPS列挙値にもよく使用されます。
caf

14

わかりやすくシンプルにしたいので、Cで使用するものを次に示します。

  • 自明な変数i,n,c、など...(1文字のみ。1文字が明確でない場合は、ローカル変数にします)
  • ローカル変数lowerCamelCase
  • グローバル変数g_lowerCamelCase
  • 定数変数ALL_CAPS
  • ポインタ変数p_接頭辞にa を追加します。グローバル変数の場合はgp_var、ローカル変数のp_var場合はconst変数になりますp_VAR。farポインターを使用する場合は、fp_代わりにを使用してくださいp_
  • 構造体:(ModuleCamelCaseモジュール=完全なモジュール名、または2〜3文字の省略形ですが、それでもですCamelCase。)
  • 構造体メンバー変数lowerCamelCase
  • 列挙型ModuleCamelCase
  • 列挙値ALL_CAPS
  • 公開機能ModuleCamelCase
  • プライベート機能CamelCase
  • マクロCamelCase

構造体をtypedefしていますが、タグとtypedefの両方に同じ名前を使用しています。タグは一般的に使用されることを意図していません。代わりに、typedefを使用することをお勧めします。また、カプセル化のためにパブリックモジュールヘッダーでtypedefを転送宣言し、typedefで指定された名前を定義で使用できるようにします。

完全な struct

typdef struct TheName TheName;
struct TheName{
    int var;
    TheName *p_link;
};

qtフレームワークについては何も知りませんが、好きなスタイル形式でコードを書くことができます。私の知る限り、あなたをそこから遠ざけるものは何もありません。
SeanRamey 2018

10

C#、java、C、C ++、および目的Cを同時にコーディングして、私は非常にシンプルで明確な命名規則を採用して、私の人生を簡素化しました。

まず第一に、それは最新のIDE(eclipse、Xcodeなど)のパワーに依存しており、ホバーまたはCtrlキーを押しながらクリックすることで高速な情報を取得する可能性があります...それを受け入れ、プレフィックス、サフィックスの使用を抑制およびIDEによって単に与えられる他のマーカー。

次に、規約:

  • 名前は、あなたが何を持っているかを説明する読みやすい文章でなければなりません。「これは私の慣習です」のように。
  • 次に、文から規則を取得する4つの方法:
    1. THIS_IS_MY_CONVENTION(マクロ、列挙型メンバー)
    2. ThisIsMyConvention(ファイル名、オブジェクト名(クラス、構造体、列挙型、共用体...)、関数名、メソッド名、typedef)
    3. this_is_my_conventionグローバル変数とローカル変数、
      パラメーター、構造体と共用体の要素
    4. thisismyconvention [オプション]非常にローカルで一時的な変数(for()ループインデックスなど)

以上です。

それは与えます

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

キャメルケースとアンダースコアの分離を混合しないことをお勧めします(構造体メンバーに提案したように)。これは紛らわしいです。あなたが思うに、私は持っているget_lengthので、おそらく持っているべきでありmake_subset、それが実際にあることがわかりますmakeSubset。最小の驚きの原則を使用し、一貫している。

CamelCaseは、構造体、typedef、列挙型などの名前を入力するのに役立ちます。ただし、これですべてです。残りすべて(関数名、構造体メンバー名など)には、underscore_separationを使用します。


1
はい、命名規則の主なものは予測可能性と一貫性です。また、Cライブラリ自体はスペースに_を付けてすべて小文字にしたので、プロジェクトで2つの異なる命名規則に対処する必要がないようにそれを使用することをお勧めします(作成するlibcの周りにラッパーを記述しない場合)それはあなたのネーミングに一致します。しかし、それは
総計

また、末尾にt」が付いたtypedefも使用しますが、それを推奨する人はいないようです。実際、標準ライブラリには一貫性がありません。div_t(stdlib.h)は構造体であり、tm(time.h)もそうです。また、tm構造体のメンバーを見てください。すべてのメンバーにはtmがプレフィックスとして付けられており、意味がなく醜い(IMO)ようです。
JeffV 2009年

1
「名前を入力するのにCamelCaseは便利だと思います...」大文字で始めると、実際にはPascalCaseです。
Tagc 16

7

これは(見かけ上)珍しいものです。CamelCaseのモジュール名、次にアンダースコア、CamelCaseの関数名またはファイルスコープ名です。だから例えば:

Bluetooth_Init()
CommsHub_Update()
Serial_TxBuffer[]

2
それほど珍しくはありませんが、非常に便利です。
chux-モニカを

3

私は1つのことに混乱しています。あなたは、新しいプロジェクトの新しい命名規則を作成することを計画しています。通常、会社全体またはチーム全体の命名規則が必要です。何らかの形式の命名規則を持つプロジェクトがすでにある場合は、新しいプロジェクトの規則を変更しないでください。上記の慣習があなたの既存の慣行の単なる成文化であるならば、あなたは黄金です。既存のデファクトスタンダードとは異なるほど、新しいスタンダードでマインドシェアを獲得するのは難しくなります。

私が追加する唯一の提案については、uint32_tとsize_tのスタイルの型の最後にある_tを好きにしています。ハンガリー語で「逆」だと不平を言う人もいますが、Cっぽいです。


3
まあ、ここでの慣習は至る所にあり、一貫性がないので、私はそれを文書化しようとしています。また、それが私が求めている理由でもあります。コミュニティのコンセンサスとは何かを確認するため。
JeffV 2009年

私はその痛みを理解しています。ただし、最も一般的な既存の規則のサブセットが必要です。ランダムなインターネットWebページではなく、そこから開始する必要があります。また、他の開発者に彼らが良いと思うものを尋ねるべきです。
jmucchiello 2009年

7
_tで終わる型名はPOSIX標準で予約されていると思います。
caf

4
_tで終わる名前は予約されています。参照gnu.org/software/libc/manual/html_node/Reserved-Names.htmlは、「名『を_t』が終わり、追加型の名前のために予約されていること。」
エティエンヌ

2

また、自動名前補完を行うための単語順序についても検討する必要がありますより簡単。

良い習慣:ライブラリ名+モジュール名+アクション+サブジェクト

パーツが関連性がない場合はスキップしてください。ただし、少なくともモジュール名とアクションは常に提示する必要があります。

例:

  • 関数名:os_task_set_priolist_get_sizeavg_get
  • 定義(ここでは通常、アクション部分はありません):OS_TASK_PRIO_MAX

0

多くのものが存在する可能性があり、主にIDEがいくつかのトレンドを指示し、C ++の規則も推進しています。一般的にCの場合:

  • UNDERSCORED_UPPER_CASE(マクロ定義、定数、列挙型メンバー)
  • underscored_lower_case(変数、関数)
  • CamelCase(カスタムタイプ:構造体、列挙型、共用体)
  • uncappedCamelCase(oppa Javaスタイル)
  • UnderScored_CamelCase(名前空間の種類の変数、関数)

グローバルのハンガリー語表記は問題ありませんが、タイプはできません。簡単な名前であっても、少なくとも2文字を使用してください。


-1

私はそれらが初心者に役立つと思います:cでの変数の命名規則

  1. アルファベット文字(az、AZ)、数字(0-9)、アンダースコア(_)を使用する必要があります。%、$、#、@などの特殊文字を使用することはできません。したがって、変数としてuser_nameを使用できますが、user&nameは使用できません。
  2. 単語間に空白は使用できません。したがって、変数としてuser_nameまたはusernameまたはusernameを使用できますが、user nameは使用できません。
  3. 数字で名前を付けることはできません。したがって、変数としてuser1またはuser2を使用できますが、1userは使用できません。
  4. 大文字と小文字が区別される言語です。大文字と小文字は区別されます。ユーザー名などの変数を使用する場合、父親用にUSERNAMEまたはUsernameを使用することはできません。
  5. 変数宣言にはキーワード(char、int、if、for、whileなど)を使用できません。
  6. ANSI規格では、変数名として31文字の長さが認識されます。

この投稿は、制限ではなく命名規則について議論することを明確に目的としています。あなたがリストしたのは、それらが構文エラーであるために実行することすらできないことです。
追跡
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.