gpt4 book ai didi

C++:在函数调用中省略参数值是否有效?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:00:23 25 4
gpt4 key购买 nike

当使用 GCC 6 从源代码编译 VTK 7.0.0 时,我遇到了以下构建错误:

error: expected primary-expression before ‘(’ token

radioButton_Min->setGeometry(QRect(10, 20, , 17));

用于与先前 Fedora 版本捆绑在一起的 GCC 5 构建良好的代码。我意识到这可能是 VTK 作者的错误,但考虑到用于构建的代码,这里有两个问题:

  • 此代码是否有效的 C++?
  • 此代码是否对 GCC 和/或其他具有一些松散设置的编译器有效,但不符合标准?目前我的警告和错误设置非常严格。

重要修改:

刚刚发现这段代码是用 Qt UIC(接口(interface)编译器)生成的,它根据 .ui 接口(interface)定义文件生成 C++ 代码。可能以前版本的 UIC 对此有不同的处理方式。但是,对我来说,问题仍然存在:您能否引用标准来肯定这是非法的 C++?

最佳答案

5.2.2 Function call

A function call is a postfix expression followed by parentheses containing a possibly empty, comma-separated list of initializer-clauses which constitute the arguments to the function.

请注意,这仅表示函数调用的参数列表“可能为空”。明显地。但除此之外,参数列表中的每个参数都是一个 initializer-clause

initializer-clause8.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 的第二种可能形式为空。保证有运算符(operator)。

剩下throw-expression:

throw-expression:
throw assignment-expression opt

这可能看起来很奇怪,但第 15 节定义了:“抛出表达式的类型为 void”。这只是 void 类型的表达式。底线是这个语法规则也不能为空。

这最终排除了函数调用的参数为空的可能性。 C++ 标准指定的语法规则排除了这一点。

关于C++:在函数调用中省略参数值是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39319320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com