C++ 这是无效的C++;? struct杂交表达{ 稀土元素; 表达式节点*en; }; 载体加压; 插入(hexpression.begin()+starti, (杂交表达){NULL,en});
gcc在没有警告的情况下构建,但VisualStudio2010甚至不会编译它C++ 这是无效的C++;? struct杂交表达{ 稀土元素; 表达式节点*en; }; 载体加压; 插入(hexpression.begin()+starti, (杂交表达){NULL,en});,c++,C++,gcc在没有警告的情况下构建,但VisualStudio2010甚至不会编译它 不喜欢这个位:(CopyDeXuffress){NULL,En} /Cult>< P>这是当前标准中不有效的C++。我认为GCC允许它因为GCC特定的编译器扩展。 < P>这是使用C++中不包含的C++编程语言的一部分,它被称为“复合文字”。code>g++-ansi将对此进行诊断,并说 警告:ISO C++禁止复合文字< /P> 这不是C++0x的一部分 与C++0x兼容的语法应该是 struct HybridEx
不喜欢这个位:<代码>(CopyDeXuffress){NULL,En} /Cult>
< P>这是当前标准中不有效的C++。我认为GCC允许它因为GCC特定的编译器扩展。 < P>这是使用C++中不包含的C++编程语言的一部分,它被称为“复合文字”。code>g++-ansi将对此进行诊断,并说 警告:ISO C++禁止复合文字< /P> 这不是C++0x的一部分 与C++0x兼容的语法应该是struct HybridExpression {
RawExpressionElement *ree;
ExpressionNode *en;
};
vector<HybridExpression> hexpression;
hexpression.insert(hexpression.begin() + starti,
(HybridExpression) {NULL, en});
引用C99标准第6.5.2.5段:
由括号组成的后缀表达式
类型名称后跟括号内的初始值设定项列表
是复合文字。它提供了一个未命名的对象,其
值由初始值设定项列表给出
根据,您可以在用GCC编译的C++程序中使用C扩展(包括C99的东西)。
是您实际使用的扩展。编译器错误消息是什么?至少从N3242开始,C++0x中不包含复合文字,并且非常量初始值设定项不是本例中使用的扩展(它们是gcc对C89语言的扩展,而不是对C++)。@Cubbi:正如第一个链接所述,你可以使用C++的C语言的GCC扩展。是的,第一个链接很好,这就是为什么我没有投票。第二个不相关。应该是@Cubbi:谢谢,我第一次没有找到它。@tm1rbrt:你仍然可以因为他们放弃了C而对他们大发雷霆@库比:你安装了Microsoft Visual C吗?不,是微软Visual C++。自从Microsoft C/C++Compiler 7.0发布以来,他们就没有假装支持C标准,我认为它是在C99完成之前发布的。@Cubbi,你是说
HybridExpression(NULL,en)
?请注意括号,而不是大括号。@Rob Adams:圆括号会调用HybridExpression的双参数构造函数。花括号使用初始值设定项列表对其进行初始化:由于统一的初始化,它也可以在不显式声明HybridExpression
对象的情况下工作:hexpression.insert(hexpression.begin()+starti,{NULL,en})代码>
hexpression.insert(hexpression.begin() + starti, HybridExpression{NULL, en});