一部のCプロジェクトでは、関数名はモジュール名を示す共通のプレフィックスで始まります。次に例を示します。
mymodule_do_this_stuff();
mymodule_do_that_stuff();
リンケージが内部で、名前空間の衝突の可能性がない場合に、そうすることの正当化はありますか?
例えば、
static void mymodule_do_this_stuff(void)
{
...
}
なぜプレフィックスが最初にあるのですか?
関数名の接頭辞は、名前の競合を回避することを目的としたC言語の慣習です。
これは、大規模なコードベースのさまざまなサブコンポーネントで異なるチームがdo_this()
およびdo_that()
を簡単に使用できる大きなプロジェクトで特に適しています。
Cにはnamespace
またはpackage
機能がないため、接頭辞が最も一般的な回避策です。これが唯一の回避策ではありません: 他のアプローチ がありますが、独自の欠点があります。
静的関数には意味がありますか?
もちろん、内部静的関数にプレフィックスを付けても、名前の競合は減りません。これは、最初に決定されたプレフィックス方式の副作用です。
この慣行を正当化する理由は次のとおりです。
static
関数が最初から静的であるとは限らなかったことに留意してください。 static
かどうかstatic
は、時間の経過とともに変化する可能性があるものです。また、接頭辞付きの名前と接頭辞なしの名前を混在させると、そのような自然な変更が必要以上に苦痛になる可能性があります。ここでは、名前の衝突には2つの重要なタイプがあります。 compilerは、スコープルールにより、関数を区別するのに問題はありません。あなたの問題はあなたがまだ衝突しているということですプログラマーの頭脳の中で
このように考えてください。8つのモジュールにすべてprocess_data()
関数があり、process_data()
内の障害を示すスタックトレースを取得した場合、どのモジュールが障害を生成しましたか?接頭辞としてモジュール名を使用すると、名前を一目で確認して、どのprocess_data
は、多くの探偵の仕事をすることなく参照されています。
ファイルローカル関数でも接頭辞付きの名前を使用する別の理由があります。それらは、 id-utils などの言語スコープの完全な分析なしに、単純なテキスト検索とテキストインデクサーでナビゲートできます。 Cプロジェクトの歴史は90xにまで遡ることが多いため、それは重要な理由です。