声明说明符和声明符

时间:2012-10-26 18:45:35

标签: c variables static declaration storage-class-specifier

参考问题Where in a declaration may a storage class specifier be placed?,我开始分析declaration-specifiersdeclarators的概念。以下是我理解的积累。

声明

  • 通常,C声明遵循declaration-specifiers declarators;
  • 的语法
  • declaration-specifierstype-specifiersstorage-class-specifierstype-qualifiers
  • 组成
  • declarators可以是变量,指针,函数和数组等。

我假设的规则

  • declaration-specifiers可以按任何顺序指定,例如
  • 不能只有一个storage-class-specifier
  • 另一方面,可以有多个type-qualifiers
  • storage-class-specifier不得使用declarator

问题

Q1:在常量指针的声明中,我看到declaratortype-qualifier混合如下

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

Q2:可以指向static int。是否有可能提供指针static存储类?表示指针是静态的。

3 个答案:

答案 0 :(得分:3)

我不确定我是否完全理解你的第一个问题。就C ++ 03而言,语法constcv-qualifiercv-qualifier {(1}}(作为特定类型的decl-specifier-seq)可以出现type-specifier,这是声明的“常见”部分,也可以出现在init-declarator-list中,const以逗号分隔的单个声明符序列。

语法是专门制定的,属于单个指针声明符的*说明符必须跟随 const。在第一个*之前的int const *a, *b; 说明符不被视为单个声明符的一部分。这意味着在这个例子中

const

decl-specifier-seq属于左侧:a,是声明中的“常见”部分。即bint const *都声明为int *a, const *b; 。同时这个

static int

只是格式不正确,无法编译。

你的第二个问题对我来说也不清楚。好像你倒退了。您声称“可以指向static int”?不,没有办法宣称“指向int的指针”。您可以通过

声明一个指向static int *p; 的静态指针
{{1}}

在这种情况下,指针本身是静态的,如你所愿。

答案 1 :(得分:0)

  

Q2:可以有一个指向static int的指针。是否有可能为指针提供静态存储类?表示指针是静态的。

嗯,是的:

static T *a;

声明a指向T的指针。 a具有静态存储持续时间。

答案 2 :(得分:0)

通常,C的“声明”就像这样的声明说明符声明符;

这里,“声明说明符”由类型说明符,存储类说明符和类型限定符组成。

“声明符”可以是变量,指针,函数和数组等。

错误,例如:-[错误]预期的声明说明符或字符串常量前的“ ...” 出现这种类型的错误,原因是声明中存在问题。