web-dev-qa-db-ja.com

Cモジュールの関数名にモジュール固有のプレフィックスが広く使用されているのはなぜですか?

一部のCプロジェクトでは、関数名はモジュール名を示す共通のプレフィックスで始まります。次に例を示します。

mymodule_do_this_stuff();

mymodule_do_that_stuff();

リンケージが内部で、名前空間の衝突の可能性がない場合に、そうすることの正当化はありますか?

例えば、

static void mymodule_do_this_stuff(void)
{
  ...
}
23
user6007354

なぜプレフィックスが最初にあるのですか?

関数名の接頭辞は、名前の競合を回避することを目的としたC言語の慣習です。

これは、大規模なコードベースのさまざまなサブコンポーネントで異なるチームがdo_this()およびdo_that()を簡単に使用できる大きなプロジェクトで特に適しています。

Cにはnamespaceまたはpackage機能がないため、接頭辞が最も一般的な回避策です。これが唯一の回避策ではありません: 他のアプローチ がありますが、独自の欠点があります。

静的関数には意味がありますか?

もちろん、内部静的関数にプレフィックスを付けても、名前の競合は減りません。これは、最初に決定されたプレフィックス方式の副作用です。

この慣行を正当化する理由は次のとおりです。

  • 命名スキームの一貫性:80%の時間でプレフィックスを使用する場合、残りの20%の関数でそれを使用しないと、予想以上に混乱が生じる可能性があります。
  • 進化における柔軟性:すべてのstatic関数が最初から静的であるとは限らなかったことに留意してください。 staticかどうかstaticは、時間の経過とともに変化する可能性があるものです。また、接頭辞付きの名前と接頭辞なしの名前を混在させると、そのような自然な変更が必要以上に苦痛になる可能性があります。
39
Christophe

ここでは、名前の衝突には2つの重要なタイプがあります。 compilerは、スコープルールにより、関数を区別するのに問題はありません。あなたの問題はあなたがまだ衝突しているということですプログラマーの頭脳の中で

このように考えてください。8つのモジュールにすべてprocess_data()関数があり、process_data()内の障害を示すスタックトレースを取得した場合、どのモジュールが障害を生成しましたか?接頭辞としてモジュール名を使用すると、名前を一目で確認して、どのprocess_dataは、多くの探偵の仕事をすることなく参照されています。

17
bta

ファイルローカル関数でも接頭辞付きの名前を使用する別の理由があります。それらは、 id-utils などの言語スコープの完全な分析なしに、単純なテキスト検索とテキストインデクサーでナビゲートできます。 Cプロジェクトの歴史は90xにまで遡ることが多いため、それは重要な理由です。

16
max630