使用GCC 6从源代码编译VTK 7.0.0时,我遇到了以下构建错误:
错误:在'('token
之前预期的primary-expressionradioButton_Min-> setGeometry(QRect(10,20,17));
用于与之前的Fedora版本捆绑在一起的GCC 5构建的代码。我意识到这可能是VTK作者的错误,但鉴于用于构建的代码,这里有两个问题:
重要编辑:
刚刚发现此代码是使用Qt UIC(接口编译器)生成的,该代码基于.ui接口定义文件生成C ++代码。可能以前版本的UIC处理的方式不同。但是,对我来说,问题仍然存在:你能引用标准来肯定这是非法的C ++吗?
答案 0 :(得分:3)
5.2.2函数调用
函数调用是后缀表达式,后跟括号 包含一个可能为空的逗号分隔列表 initializer-clause,构成函数的参数。
请注意,这只表示函数调用的参数列表可能“可能为空”。明显。但是参数列表中的每个参数都是initializer-clause
。
initializer-clause
中的8.5 Initializers
定义如下:
initializer-clause:
assignment-expression
braced-init-list
因此,函数调用的每个参数都是assignment-expression
或braced-init-list
。
braced-init-list
始终以{
:
braced-init-list:
{ initializer-list , opt }
{}
那不包括那个。因此,为了使函数调用的单个参数可能为空,assignment-expression
必须能够以某种方式解析为空规则。走下兔子洞:
assignment-expression:
conditional-expression
logical-or-expression assignment-operator initializer-clause
throw-expression
conditional-expression
导致了算术表达式的兔子洞:
conditional-expression:
logical-or-expression
logical-or-expression ? expression : assignment-expression
这不能为空。进一步解决logical-or-expression
将变得非常古老。最重要的是,这里有一个运营商,某处,所以这不可能是空的。
assignment-operator: one of = *= /= %= += -= >>= <<=
这消除了第二种可能的assignment-expression
形式为空。它保证有一个操作员。
离开throw-expression
:
throw-expression:
throw assignment-expression opt
这可能看起来很奇怪,但第15节定义:“throw-expression的类型为void”。这只是void
类型的表达式。最重要的是,这个语法规则也不能为空。
这最终排除了函数调用的参数为空的可能性。 C ++标准规定的语法规则排除了这一点。