c++ - int a[] = {1,2,};为什么允许在初始化列表中使用尾随逗号?

标签 c++ syntax grammar language-lawyer

也许我不是来自这个星球,但在我看来,以下应该是语法错误:

int a[] = {1,2,}; //extra comma in the end

但事实并非如此。当这段代码在 Visual Studio 上编译时我感到很惊讶,但我已经学会了就 C++ 规则而言不信任 MSVC 编译器,所以我检查了标准并且它标准也允许。不信可以看8.5.1的语法规则。

enter image description here

为什么允许这样做?这可能是一个愚蠢无用的问题,但我想让你明白我为什么要问。如果它是通用语法规则的一个子案例,我会理解 - 他们决定不再让通用语法变得更难,只是为了禁止在初始化列表末尾使用冗余逗号。但是不,额外的逗号是明确允许的。例如,不允许在函数调用参数列表的末尾有多余的逗号(当函数采用 ... 时),这是正常的 .

所以,再一次,是否有任何特殊原因可以明确允许使用这个冗余逗号?

最佳答案

它可以更轻松地生成源代码,也可以编写日后可以轻松扩展的代码。考虑添加额外条目需要什么:

int a[] = {
   1,
   2,
   3
};

...您必须将逗号添加到现有行 添加新行。将其与三个 already 后面有逗号的情况进行比较,您只需添加一行。同样,如果你想删除一行,你可以这样做而不用担心它是否是最后一行,你可以重新排列行而不用逗号。基本上,这意味着您处理线条的方式是一致的。

现在考虑生成代码。类似于(伪代码):

output("int a[] = {");
for (int i = 0; i < items.length; i++) {
    output("%s, ", items[i]);
}
output("};");

无需担心您正在写的当前项目是第一个还是最后一个。简单得多。

关于c++ - int a[] = {1,2,};为什么允许在初始化列表中使用尾随逗号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49872862/

相关文章:

C动态分配malloc结构

java - 语法或语义问题?

c - C11 _Atomic 说明符与限定符语法不规则的基本原理?

java - GATE:JAPE规则Java RHS特征图

c++ - 创建动态数组?

c++ - 为什么我的指针不是结构或 union ?

c++ - 从浏览器运行 ATL COM DLL(调用方法)

JavaScript,声明变量时语法困惑

c++ - constexpr 和初始化

parsing - 规范语法中的结构差异