在C语言中,declarator是否为identifier的超集?二者区别解析
C17中Declarator与Identifier的区别解析
你的理解完全正确,先明确两个核心概念:
- 标识符(Identifier):就是实体的“纯名字”,是用来指代变量、函数、类型等的独立标记,比如你例子里的
x、y、p、foo——它们只是给实体贴的“名字标签”,不含任何类型属性信息。 - 声明符(Declarator):是包含标识符,再附加类型修饰信息的语法结构,用来明确这个实体到底是数组、指针、函数还是普通对象。你举的几个例子都精准:
// x是标识符,x[5]是声明符(直接声明符),描述x是含5个int的数组 int x[5]; // y是标识符,y[]是声明符,描述y是字符数组(大小由初始化串确定) char y[]="Hello there"; // p是标识符,*p是声明符,描述p是指向float的指针 float *p; // foo是标识符,foo(int zx, float zy)是声明符,描述foo是接受int/float参数、返回void的函数 void foo(int zx, float zy);
至于你问的“full declarator(完整声明符)”,确实是C标准里的正式术语,必须搞清楚。它是从最内层标识符开始,逐层包裹所有类型修饰符后的完整结构,用来精准描述实体的全部类型属性。举个复杂点的例子:
// 完整声明符是 *(*bar[3])(double) void *(*bar[3])(double);
拆解这个完整声明符:
- 最内层是标识符
bar; bar[3]说明bar是含3个元素的数组;*bar[3]说明数组每个元素是指针;(*bar[3])(double)说明这些指针指向接受double参数的函数;- 最外层的
*(*bar[3])(double)说明这些函数返回指向void的指针。
简单说,标识符是完整声明符的“核心名字”,而完整声明符是把这个名字和所有类型修饰(数组、指针、函数参数等)打包后的完整描述,编译器就是通过完整声明符来确定实体的具体类型。
内容的提问来源于stack exchange,提问作者Cblue X
相关产品推荐
相关产品推荐

