【问题标题】:Declaration specifiers and declarators声明说明符和声明符
【发布时间】:2012-10-26 18:45:34
【问题描述】:

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

声明

  • 通常,C 声明遵循declaration-specifiers declarators; 的语法
  • declaration-specifiers 包括 type-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 存储类?表示指针是静态的。

【问题讨论】:

  • 当我们声明一个常量指针时,在我看来declaratordeclaration-specifier 混合使用。 *ptr 是declarator。理想情况下,我设想declaration-specifier 是一个领先的声明者。但在这种情况下,它是*const ptr。那么这是一个例外情况吗?

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


【解决方案1】:

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

语法特别规定,属于单个指针声明符的const 说明符必须跟随 *。在第一个 * 之前的 const 说明符不被视为单个声明符的一部分。这意味着在这个例子中

int const *a, *b;

const 属于左侧:decl-specifier-seq,声明的“通用”部分。 IE。 ab 都被声明为 int const *。同时这

int *a, const *b;

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

你的第二个问题我也不清楚。看来你把它弄反了。您声称“可以有指向static int 的指针”?不,没有办法声明“指向static int”的指针。您可以声明一个指向int 的静态指针

static int *p;

在这种情况下,指针本身是静态的,正如您所希望的那样。

【讨论】:

  • 抱歉,我误认为 static int *p 是指向静态整数的指针
【解决方案2】:

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

嗯,是的:

static T *a;

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

【讨论】:

  • static 是存储类说明符,而不是类型限定符。
【解决方案3】:

一般来说,C 的“声明”就是这样的声明说明符声明符;

这里,“声明说明符”包括类型说明符、存储类说明符和类型限定符。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多