【发布时间】:2016-12-11 01:15:07
【问题描述】:
在尝试实现 C11 解析器(用于教育目的)时,我发现在 C11 (p. 470) 和 C99 (p. 412)(感谢 Johannes!)中,直接声明符被定义为:
(6.7.6) direct-declarator:
direct-declarator [ type-qualifier-list? * ]
起初,我认为这是语法错误(类型列表不应该是可选的)。然而,当我在我的参考编译器(clang)中尝试这个时,我得到了一个相当意外的错误:
int array[*] = { 1, 2, 3 };
// error: star modifier used outside of function prototype
显然,(在 clang 中)这被称为 star 修饰符。
我很快了解到它们只能用于函数签名:
void foobar(int array[*])
但是,它们只能在声明中使用。尝试在函数定义中使用它也会导致错误:
void foobar(int array[*]) {
// variable length array must be bound in function definition
}
据我所知,预期的行为是在函数声明中使用[*],然后在函数定义中使用固定数字。
// public header
void foobar(int array[*]);
// private implementation
void foobar(int array[5]) {
}
但是,我从来没有见过它,我也不太明白它的目的。
- 它的目的是什么,为什么要添加它?
- 和
int[]有什么区别? - 和
int *有什么区别?
【问题讨论】:
-
自 C99 以来一直使用 C。我相信它的意思是“这里 VLA 号码的占位符”。
int[][]无效,但int[][*]有效(在非定义函数原型中)。 -
你说得对,我忘了提,但我搜索了从 clang 得到的错误,它们对应于他们的 VLA 单元测试套件。不过,我想知道他们的目的。谢谢!
-
22 次浏览,这已经是“c 星修饰符”的第一个谷歌搜索结果。您发现了一个不起眼的功能。
-
Clang 什么时候成为“参考编译器”?
-
@user2357112 我不认为他的意思是在任何特定的能力,只是他个人用来检查他对标准的解释是否合理的编译器。
标签: c function parameters variable-length-array