int q = {1,2};奇特的初始化列表

时间:2015-02-09 14:53:30

标签: c

我遇到了下面的初始化,可见VS2012  显示错误抱怨太多初始化程序。在海湾合作委员会似乎  返回第一个元素作为值。

为什么GCC支持这种特殊的初始化?

#include <stdio.h>

int main()
{
    int q = {1,2};
    char c = {'s','t','\0'};  /* c is 's' */
    printf("%d\n",q); /* prints 1*/
}

1 个答案:

答案 0 :(得分:36)

C11:6.7.9初始化(p11):

  

标量的初始值设定项应为单个表达式,可选择用大括号括起来。

因此,这是允许的

int q = {1};   

您可以将大括号中的标量对象的初始值设定项括起来({})。请注意,此处使用动词 。标准说:

5.1.1.3诊断(P1):

  

如果预处理转换单元或转换单元包含违反任何语法规则或约束的情况,则符合要求的实现应生成至少一条诊断消息(以实现定义的方式标识),即使该行为也明确指定为未定义或实施定义的

因此,它取决于编译器如何处理

int q = {1,2}; 

使用标记-pedantic -Wall -Wextra在GCC 4.8.1上编译并发出警告

[Warning] excess elements in scalar initializer [enabled by default]   

现在的问题是:What happend with the remaining initializers? 它是bug


注意: C11:6.5.17(p3)表示逗号运算符不能出现在使用逗号分隔列表中项目的上下文中(例如函数或初始化列表的参数)。

请勿将,中的{1,2}逗号运算符混淆。正如Keith Thompson所指出的那样,初始化程序中的表达式赋值表达式,并且它不能包含逗号运算符 -水平。这意味着它可以在带括号的表达式中使用,也可以在这种上下文中的条件运算符的第二个表达式中使用。在函数调用

f(a, (t=3, t+2), c)

该函数有三个参数,第二个参数的值为5