2011-07-07 12 views
3

がtypedefを定数構造体へのポインタのtypedef速記

typedef struct some_struct { 
int someValue; 
} *pSomeStruct; 

で構造体を宣言した後、 'CONST some_structの*のVAR'

void someFunction1(const pSomeStruct var) 

を意味する、CONST宣言である関数へのパラメータとして渡します

some_struct * const var 

これは、ISO C規格のセクション6.7.5.1にも記載されています。この場合、 'const'はポインターに適用され、ポインターが指すデータには適用されません。

typedef const struct some_struct *pcSomeStruct; 
void someFunction2(pcSomeStruct var) 

答えて

8

、ないのtypedefポインタ:)

typedef struct some_struct {} some_struct; 

void some_function1(some_struct *var); 
void some_function2(const some_struct *var); 
void some_function3(some_struct *const var); 
void some_function4(const some_struct *const var); 

それとも、全くのtypedefしていない操作を行います限りC型システムの私の理解が進むにつれてD

struct some_struct {}; 

void some_function1(struct some_struct *var); 
void some_function2(const struct some_struct *var); 
void some_function3(struct some_struct *const var); 
void some_function4(const struct some_struct *const var); 
+0

だから私はそれを短くしたいと思っています:)機能パラメータは完全に明示的ですが、言葉で詰まっています – Ulterior

+0

簡略化は必ずしも良いことではありません:クリティカルパッチアップデートやそれ以外のものは 'cpu'ですか?私はexplicit..nessのようです – pmg

+3

@ user757808 - 私は 'user_defined_const_pointer_typedef'を見るよりも' const'キーワードをポインタで見るのが好きで、APIがどのような名前付け規則をconstポインタ 'typedef'に使うのか把握しなければなりません。 Cを知っている人は 'const int *'と 'int * const'の違いを知っています。誰もが 'const some_struct'と' const_some_struct'の違いを自動的に見ているわけではありません。 –

1

ものが有効である: -

そこで質問があるのtypedefとショートハンド表記でのconst構造体へのポインタを宣言するための方法がある、または常にそれのための特別な個別の宣言が存在しなければなりません

typedef struct some_struct { 
    int someValue; 
} const * pSomeStruct; 

typedef struct some_struct { 
    int someValue; 
} const * const pSomeStruct; 

このスタイルはC++でも広く使用されていませんが、むしろ:

struct some_struct { 
    int someValue; 
}; 

struct some_struct { 
    int someValue; 
}; 

を実行してから、別のtypedefを実行してください。しかし、それは広く使われていません。他の多くのC++プログラマと私は、ポインターに対する通常の理由とは別に、void foo (some_struct const * const)などの関数を宣言します。基本的には

0

を、貴方はするべきではない。最初のtypedefは、 "structへのポインタ"としてreas型を宣言します。 constを適用すると、論理的に "structへのconstポインタ"が作成されます。構造体自体にconstを挿入するには、型自体を変更する必要があります。したがって、それは再定義されます。 AFAIKでは、Cでの入力はインクリメンタルであり、既存のものにインジェクションするのではなく、モディファイアを適用することによってのみ新しいタイプを作ることができます。

とにかく良いスタイルではないポインタのtypedef。

+0

Win32 APiはそのような宣言でいっぱいです。 IMOでは、名前が適切であれば読みやすさも向上します。 – Ulterior

+4

Win32 APIは良いスタイルではありません。実際、私が今まで見た中で最悪のコード化された主要なAPIの1つです。すべてのポインタ操作がポインタ操作であることを大声で伝えると、可読性(および誤り耐性)が向上します。 –

関連する問題