通常、3 つconst
の s のうち 2 つを使用します。
const char *const *my_strings;
3 つすべてを使用することもありますが、私の意見では、最後の 1 つが最も重要ではありません。変数 を使用するコードの分析にのみ役立ちますmy_strings
が、他の 2 つは が指す配列へのポインターmy_strings
、またはその配列の要素が指す文字列へのポインターを持つコードの分析に役立ちます。これは通常、いくつかの異なる場所 (たとえば、関数の呼び出し元と関数自体) でより多くのコードになるため、より困難なタスクになります。
変数自体を使用するコードは のスコープに限定されるため、それがmy_strings
自動変数 (関数パラメーターを含む) である場合は、十分に含まれており、タスクがより簡単になります。それをマークすることによって提供されるヘルプは、const
依然として高く評価されるかもしれませんが、それほど重要ではありません。
また、char const * const * const my_strings
「ほとんど読めない」場合は、C を読む練習を積むと状況が変わります。コードを変更するよりも、その練習をする方がよいでしょう。初心者が簡単に読める C コードを書くことにはいくらかの価値がありますが、仕事を成し遂げることほど価値はありません ;-)
typedef を使用して変数定義を短くすることができますが、多くの C プログラマーを悩ませる間接化を導入するという代償を払います。
typedef char const *ro_strptr;
ro_strptr const *my_strings;
何らかの理由で、C プログラマーは多くの場合、できるだけ多くの型を 1 か所で確認したいと考えています。型が本当に複雑になった場合 (関数へのポインター型) にのみ、型定義を使用して短縮することができます。