2016-11-13 11 views
2

char * signed char *unsigned char *(および修飾子孫) はこれを免除されていますか?言い換えればchar *、unsigned char *およびsigned char *のエイリアシングは、任意のエイリアスになります。

、私は他のタイプの別名ポインタパラメータにそれらを期待していない場合は(彼らはそれらを別名可能性があるため)、それはrestrictchar*に関数の引数を適用することをお勧めします学んだ:

int func(struct foo *f, char * restrict s /*different object*/); 

signed charとunsigned charのバリアントのrestrictキーワードを削除できますか?また

int sfunc(struct foo *f, signed char *s /*different object*/); 
int ufunc(struct foo *f, unsigned char *s /*different object*/); 

よい 別名互いに同じ種類の符号付きおよび符号なしの変異体へのポインタ?言い換えれば、intへのポインタと符号なしへのポインタを期待して、別のオブジェクトを指す必要がある場合は、とunsigned *のパラメータはそれぞれrestrict -qualifiedですか?

/* i and u should be different */ 
int uifunc(int * /*restrict?*/ i, unsigned * /*restrict?*/ u); 
+2

注:プロトタイプの 'restrict'は重要ではありません(ドキュメンテーションとして機能しますが)。関数定義内のバージョンのみが有効です。 –

答えて

3

ルールは、(C11 6.5/7)である:

オブジェクトのみが、以下のタイプの1つを有する左辺値表現によってアクセスその格納された値でなければならない:

  • オブジェクトの有効なタイプと互換性のあるタイプの修飾バージョン
  • オブジェクトの有効なタイプに対応する符号付きまたは符号なしタイプのタイプ
  • オブジェクトの有効なタイプの修飾バージョンに対応する符号付きまたは符号なしタイプのタイプ
  • 集合体または(再帰的に、副集合体または包含集合体のメンバを含む)、または
  • の文字型のいずれかを含む集合型である。

charsigned charunsigned charは、すべての文字の種類(:6.2.5/15参照)です。以前の箇条書きは、署名付きと署名なしの型に関する質問にも答えています。

固定幅の型はさまざまな型を参照するtypedefですので、そこに注意してください。

+0

優れた答えです。ありがとう! – PSkocik

関連する問題