C中的完整声明者是什么?

时间:2016-03-17 20:51:14

标签: c syntax

Harbison / Steele的C引用说明完整声明符的结尾是一个序列点。但什么是完整的声明者?

  

“完整的声明者是不属于另一个的声明者   说明符“

... 什么?

举一个例子,C标准是否保证int i = 0, *j = &i在指针i中存储变量j的内存地址?

换句话说,int i = 0部分是完整的声明者吗?

1 个答案:

答案 0 :(得分:8)

不,您正在混合声明声明者

让我引用标准中的C语法部分:

declaration:
    declaration-specifiers init-declarator-list[opt] ;

init-declarator-list:
    init-declarator-list , init-declarator

init-declarator:
    declarator
    declarator = initializer

然后:

declarator:
    pointer[opt] direct-declarator

direct-declarator:
    identifier
    ( declarator )
    ....

TL; DR:int i = 0;声明i部分是声明者

如果您有指针,那么有关完整声明符的部分很清楚。这一行:

int *p[3] = { 0 };

是一份声明。部分*p[3]完整声明符,但p[3]p也是(非完整)声明符

问你的第一个问题,是的,int i = 0, *j = &i;完全没问题,因为有两个完整的声明者:i*j。每个完整声明符的末尾都有一个序列点加上每个初始值设定项末尾的另一个序列点。你甚至可以写void *p = &p;就可以了。