2

宣言のどこにストレージクラス指定子を配置できるかという質問を参照してください。declaration-specifiersとの概念の分析を開始しましたdeclarators。以下は私の理解の蓄積です。

宣言

  • 一般に、C宣言は次の構文に従います。declaration-specifiers declarators;
  • declaration-specifiersで構成されtype-specifiersstorage-class-specifierstype-qualifiers
  • declarators変数、ポインター、関数、配列などにすることができます。

私が想定するルール

  • declaration-specifiers例として、任意の順序で指定できます
  • 1つ以上存在することはできませんstorage-class-specifier
  • 一方、複数存在する可能性がありますtype-qualifiers
  • storage-class-specifierと一緒に行くことはありませんdeclarator

質問

declaratorQ1:定数ポインターの宣言で、以下のようにとの組み合わせが見type-qualifierられます

const int *const ptr; //Need justification for the mix of declarator and type-specifier

Q2:へのポインタが存在する可能性がありますstatic int。ポインタにstaticストレージクラスを提供する可能性はありますか?ポインタが静的であることを意味します。

4

3 に答える 3

4

私はあなたの最初の質問を完全に理解しているかどうかわかりません。C ++ 03に関しては、文法constcv-qualifierです。宣言の「共通」部分である(特定の種類の)、および個々の宣言子のコンマ区切りシーケンスであるにcv-qualifier存在することができます。decl-specifier-seqtype-specifierinit-declarator-list

文法はconst、個々のポインター宣言子に属する指定子がに続く必要あるように特別に定式化されています*。最初のconst指定子の前にある指定子*は、個々の宣言子の一部とは見なされません。これは、この例では

int const *a, *b;

const左側に属します:decl-specifier-seq、宣言の「共通」部分。つまり、両方abとして宣言されint const *ます。一方、これ

int *a, const *b;

単に形式が正しくなく、コンパイルされません。

あなたの2番目の質問も私にははっきりとは見えません。あなたはそれを逆にしたようです。あなたは「へのポインタがあるかもしれない」と主張しますstatic intか?いいえ、「ポインタ」などを宣言する方法はありませんstatic intintただし、静的ポインタを宣言できます

static int *p;

この場合、ポインタ自体は、必要に応じて静的です。

于 2012-10-26T19:13:39.567 に答える
0

Q2:staticintへのポインタが存在する可能性があります。ポインタに静的ストレージクラスを提供する可能性はありますか?ポインタが静的であることを意味します。

はい、そうです:

static T *a;

aへのポインタを宣言しますTa静的ストレージ期間があります。

于 2012-10-26T18:48:22.497 に答える
0

一般に、Cの「宣言」はこの宣言指定子宣言子のようなものです。

ここで、「宣言指定子」は、型指定子、ストレージクラス指定子、および型修飾子で構成されます。

「宣言子」には、変数、ポインター、関数、配列などがあります。

次のようなエラー:-[エラー]予期される宣言指定子または文字列定数の前の「...」このタイプのエラーは、宣言に問題がある理由です。

于 2018-10-11T15:12:35.443 に答える