【发布时间】:2018-07-29 14:43:03
【问题描述】:
我浏览了this 的文章。我理解解释的规则,但我想知道在定义常量多维数组并使用给定类型的已知值直接初始化它时,究竟是什么阻止了编译器接受以下语法:
const int multi_arr1[][] = {{1,2,3}, {1,2,3}}; // why not?
const int multi_arr2[][3] = {{1,2,3}, {1,2,3}}; // OK
error: declaration of 'multi_arr1' as multidimensional array must have bounds
for all dimensions except the first
是什么阻止了编译器向右看并意识到我们正在为每个“子数组”处理 3 个元素,或者仅在程序员通过的情况下才可能返回错误,例如每个子数组的元素数量不同,例如 {1,2,3}, {1,2,3,4}?
例如,在处理一维字符数组时,编译器可以查看= 右侧的字符串,这是有效的:
const char str[] = "Str";
我想了解正在发生的事情,以便编译器无法推断数组维度并计算分配大小,因为现在在我看来,编译器拥有执行此操作所需的所有信息。我在这里错过了什么?
【问题讨论】:
-
什么“阻止”编译器遵守标准(对于 C 或 C++,它们是不同的标准,选择一个)。阻止标准允许这样做的原因是没有人为实施它写过标准提案,随后被接受。
-
^ - 那。这告诉您很多关于此功能的真正需求在实践中可能出现的程度
-
关于不同大小的初始化器应该是错误还是尺寸应该是最大的初始化器的争论将持续数十年。
-
"是什么阻止了编译器查看..." --> Little 阻止了它。 “为什么...不可能”--> C 缺乏特性:二进制常量、函数重载。需要处理新生的 Unicode 支持,_Generic。
[][] = {{…}, {…}}不是更改规范的优先事项 - 即使它很有趣。
标签: c++ c multidimensional-array compile-time