我遇到了下面的初始化,可以看出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*/
}
C11:6.7.9 初始化(第 11 页):
标量的初始值设定项shall是一个单一的表达,可选择用大括号括起来.
因此,这是允许的
int q = {1};
您可以将标量对象的初始值设定项括在大括号中 ({}
)。注意动词shall在这里使用。标准说:
5.1.1.3 诊断(P1):
如果预处理翻译单元或翻译单元包含违反任何语法规则或约束的行为,则一致的实现应产生至少一条诊断消息(以实现定义的方式标识),即使该行为也明确指定为未定义或实现 -定义的
所以,这取决于编译器如何处理
int q = {1,2};
在带有标志的 GCC 4.8.1 上编译-pedantic -Wall -Wextra
它提出了警告
[Warning] excess elements in scalar initializer [enabled by default]
现在的问题是:剩下的初始化器发生了什么? https://stackoverflow.com/questions/28412577/int-q-1-2-peculiar-initialization-list/28412748#comment45158611_28412577
It's a bug https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=684635.
Note:C11:6.5.17(p3)说逗号运算符不能出现在使用逗号分隔列表中的项目的上下文中(例如函数的参数或初始值设定项列表)。
不要混淆,
in {1,2}
with 逗号运算符. As 基思·汤普森 https://stackoverflow.com/questions/28412577/int-q-1-2-peculiar-initialization-list/28412748?noredirect=1#comment45166370_28412748指出,表达在初始化程序中是赋值表达式并且它不能包含逗号运算符在顶层。这意味着它可以在带括号的表达式中或在此类上下文中的条件运算符的第二个表达式中使用。在函数调用中
f(a, (t=3, t+2), c)
该函数有三个参数,其中第二个参数的值为5
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)