我正在阅读 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 标准(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
的指针。 这绝不是最复杂的声明符。