Linuxコードのデバイスドライバーのほとんどの関数定義が静的として定義されている理由はありますか? これには理由がありますか?
これはスコーピングのためであり、名前空間の汚染を防ぐためであると言われましたが、このコンテキストで静的定義が使用される理由を詳しく説明できる人はいますか?
Linuxコードのデバイスドライバーのほとんどの関数定義が静的として定義されている理由はありますか? これには理由がありますか?
これはスコーピングのためであり、名前空間の汚染を防ぐためであると言われましたが、このコンテキストで静的定義が使用される理由を詳しく説明できる人はいますか?
static と宣言された関数は、それらが定義されている翻訳単位の外では見えません (翻訳単位は基本的に .c ファイルです)。関数をファイルの外部から呼び出す必要がない場合は、グローバル名前空間を汚染しないように静的にする必要があります。これにより、同じ名前間で競合が発生する可能性が低くなります。エクスポートされたシンボルは、通常、ある種のサブシステム タグで識別されます。これにより、競合の範囲がさらに縮小されます。
多くの場合、これらの関数へのポインターは構造体で終わるため、実際には関数名ではなく、定義されているファイルの外部から呼び出されます。
私は同意します。これは、カーネル コードだけでなく、どの C コードでも一般的で賢明な方法です。これが低レベルのものにのみ適切であると考えないでください。1 つの .c ファイルを超える C コードは、これを考慮する必要があります。
同じ理由で、どのコードでも static を使用します。API 呼び出しのみを「公開」する必要があります。それ以外の場合は、ドライバーの外部から内部関数を呼び出すことができるなど、悪用される可能性があり、ほぼ確実に壊滅的です。
必要なものだけを外の世界に見えるようにすることは、良いプログラミングの実践です。それがカプセル化のすべてです。