声明符是否被视为“C”中标识符的“超集”?

问题描述 投票:0回答:1

我正在阅读 C 标准(C17),但我仍然不明白声明符和标识符之间有什么区别,我的猜测是标识符就是“ID”,“ID”的名称/别名C 对象”,但声明符“不仅仅是一个名称”

我的意思是:

//x is the identifier and x[5] is the declarator (direct declarator)
int x[5]; 

//y is the identifier and y[] is the declarator (direct declarator)
char y[]="Hello there"; 

//p is the identifier and *p is the declarator ('simple' declarator)
float *p; 

//foo is the identifier and 'foo(intzx, float zy)' is the declarator
void foo(int zx, float zy); 

但是我不知道这是否正确,或者我需要引入“完整声明符”的概念?

c declaration identifier
1个回答
0
投票

如果您阅读了 C 标准(C11 §6.7.6 声明符),您会发现声明符可以像标识符一样简单,但也可以非常复杂

          declarator:
                 pointeropt direct-declarator
          direct-declarator:
                  identifier
                  ( declarator )
                  direct-declarator [ type-qualifier-listopt assignment-expressionopt ]
                  direct-declarator [ static type-qualifier-listopt assignment-expression ]
                  direct-declarator [ type-qualifier-list static assignment-expression ]
                  direct-declarator [ type-qualifier-listopt * ]
                  direct-declarator ( parameter-type-list )
                  direct-declarator ( identifier-listopt )
          pointer:
                 * type-qualifier-listopt
                 * type-qualifier-listopt pointer
          type-qualifier-list:
                 type-qualifier
                 type-qualifier-list type-qualifier
          parameter-type-list:
                parameter-list
                parameter-list , ...
          parameter-list:
                parameter-declaration
                parameter-list , parameter-declaration
          parameter-declaration:
                declaration-specifiers declarator
                declaration-specifiers abstract-declaratoropt
          identifier-list:
                 identifier
                 identifier-list , identifier

名称末尾出现

opt
应该是下标,表示非终结符是可选的。

所以,这行代码中有两个声明符:

int i, *(*function)(int, int);

其中一个是

i
,一个简单的标识符。

另一个将

function
标识为指向函数的指针,该函数接受两个
int
参数并返回指向
int
的指针。 这绝不是最复杂的声明符。

© www.soinside.com 2019 - 2024. All rights reserved.